2016-12-28 49 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嗎?」 - 哪個局部變量?我看到兩個,在循環結束時都不會是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在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

輸出:

...您的代碼你想要做什麼。請在運行之前查看代碼並查看輸出。

1

從總體上看,Python不改變的變量內環路範圍(forwhile)或if結構:

你在你的功能單一d變量,無論使用它的循環內或不。

雖然有一些例外 - 其中之一就是可以在列表解析或生成器表達式中使用循環 - 這些循環中使用的變量對錶達式來說是局部的 - 儘管它們是表達式,但它們不允許一般賦值變量:

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

(本例使用Python 3打印功能)。

另一個例外是 try ... except塊中的異常被分配到的變量。該變量爲局部的,除了塊,並停止現有出它 - 但不是有一個嵌套的範圍,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