2016-12-28 5 views
-3
def loop(): 
    d = 0 
    for x in range(12): 
     d+=1 #this 'd' is not the same as the one above. 
    print(d) 

上記のコードでは、関数のローカル変数はまだ0ではないでしょうか?どのようにしてループの内部変数の代わりに関数変数を使用するように変更できますか?ローカル関数変数をループ内で使用する

+0

'd'は' 12' – MooingRawr

+1

になりますので、あなたのインデントはあなたがしたいものですか?関数のローカル変数はまだ0になりませんか? - どのローカル変数?私は2つを見て、いずれもループの最後には0ではないでしょう。 – user2357112

+0

@MooingRawrループは関数内のDの値に影響します。 – ihazgum

答えて

2

私はあなたがスコープの間で混乱して得ていると思います関数の外側とその内部にあります。

d = 1 
def a(): 
    d = 0 # this is a different d from line 1 
    for x in range(12): 
     d += 1 # this is the same d as line 3 
    print(d) # same d as line 3 
print(d) # same d as line 1 

おそらくローカルスコープの変数については読んでいるが、混乱している可能性があります。行をインデントしても、「新しいローカルスコープ」は作成されません。唯一の時間は関数内にあります。

1

これはスコープがPythonでどのように機能するかではありません。関数内のループによって、dにアクセスすることができます。それらは同じdです。

def loop(): 
    d = 0 
    for x in range(12): 
     d+=1 #this 'd' IS the same as the one above. 
    print(d) 

loop() 

コードを実行すると、同じdであることがわかります。

出力:

...あなたのコードは何をしたいん。質問する前にコードを実行し、出力を確認してください。 Pythonは(whilefor)をループ内の変数のスコープを変更したり、if構造はありません一般的な方法で

1

あなたは関係なく、ループ内かどうか、それを使用するのではなく、あなたの関数では、単一のdの変数を持っています。

リスト内包表記やジェネレータ式内でループを使用できるという例外もありますが、これらのループで使用される変数は式のローカルです。ただし、式では一般的なものではありません変数の割り当て:

def a(): 
    d = 0 
    any(print(d) for d in range(12)) 
    print("main d:", d) 

(この例では、Python 3の印刷機能を使用しています)。

例外は、 try ... exceptブロックに例外が割り当てられる変数です。この変数はブロック以外に対してローカルであり、IT関連の外ではなく、ネストされたスコープを持つ既存の、Pythonは現在のスコープからの変数を消去ん止む:

In [34]: def b(): 
    ...: a = 1 
    ...: try: 
    ...:  1/0 
    ...: except ZeroDivisionError as a: 
    ...:  print(a) 
    ...: print(a) 
    ...:  

In [35]: b() 
division by zero 
--------------------------------------------------------------------------- 
UnboundLocalError       Traceback (most recent call last) 
... 
----> 7 print(a) 
     8 
関連する問題