2016-06-20 38 views
0

我對python變量的範圍感到困惑。該工作在這種情況下Python變量的作用域 - 圍繞變量和局部變量之間的區別

如何請看下面的例子

i = 12 
if i==12 : 
    str = "is equal" 
else: 
    str = "NOT" 
print str //Prints is equal - recognized the string str 

變量str僅在if語句的範圍,其範圍在else語句丟失。由於蟒蛇沒有吊裝。我很困惑這個例子works.I如何閱讀this後,並且聲明的變量按以下順序作用域

1-L(局部變量優先考慮)

2-E(內附變量)

3-G(全局變量)

4-B(內藏)

我的問題是什麼是Enclosing變量和局部變量之間的區別?

回答

4

變量str僅在if語句的範圍內,並且其範圍在else語句中丟失。

沒有。 Python是函數作用域,而不是作用域的作用域。輸入if塊不會創建新的範圍,因此str變量仍處於print的範圍內。

包含變量是函數中包含給定函數的變量。

def f(): 
    x = 3 
    def g(): 
     print x # enclosing variable 
    g() 
+0

感謝您的理解 - 標記爲答案 –

1

Python沒有一般塊範圍,唯一的功能範圍(與案件像class聲明一些額外的怪事):當你關閉它們的發生。在函數中分配的任何名稱在函數的生命週期內都將保持有效。

def foo(a): 
    def bar(b): 
     return a + b 
    return bar 

因此,在這種情況下,foo(1)(2)將創建一個bar其封閉範圍是foo電話與a == 1,然後調用bar(2),這將看到a爲:

封閉範圍內築巢,當函數聲明,如適用1

附錄範圍也適用於lambda函數;他們可以閱讀在周邊其中使用lambda點範圍內可用的變量,所以這樣的事情:

val_to_key = {...} # Some dictionary mapping values to sort key values 
mylist.sort(key=lambda x: val_to_key[x]) 

val_to_key可用;它不在sort函數的範圍內,但lambda函數在聲明時綁定了封閉範圍,因此可以使用val_to_key

相關問題