我在函數中使用名稱空間概念尋找一些解釋。函數名稱空間的概念(在賦值之前引用)
下面是這將提高UnboundLocalError代碼:局部變量賦值...
x = 1
def foo():
print x
x = 2
之前引用我明白了這一點應該引發異常。但我想了解python知道變量是如何在本地命名空間中的。在行print x處,x不在局部變量dict中。
x = 1
def foo():
print 'local before print x : ',locals()
print x
print 'local after print x :',locals()
x = 2
foo() # call function, print local namespace before raising exception
local before print x : {}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in foo
UnboundLocalError: local variable 'x' referenced before assignment
在打印x之前,本地命名空間字典是空{}(這是非常明顯的)。那麼python如何知道x是局部變量。
這與類
a = [1]
class b():
c = a
a = 2
print 'c inside class ', b.c
'c inside class [1]'
d = b()
不發生異常,在類類似案件的工作方式不同。
如果有人可以幫助我解釋概念,python在賦值之前如何知道這個變量是局部變量。
我查了很多表單和網站的解釋,但沒有找到任何。
有帖子和形式解釋如何解決這種情況。例。 UnboundLocalError: local variable … referenced before assignment。 但我正在尋找Python後面工作。
是的,我完全同意你的看法。但是當我在打印這個變量之前打印locals()時,它會給出空字典。那麼python如果不在當地人中尋找局部變量,那麼哪裏呢? –
我不明白。如果您在任何地方的函數中都有一個賦值,那麼每個訪問和賦值都將被編譯爲訪問局部變量。如果在運行時發生分配,字典將相應地擴展。如果在分配前完成訪問,字典將缺少條目,這將引發異常。 – Alfe
我想知道,如果該變量在函數中具有賦值,python將查找某處。因爲我知道python首先查看'locals()'內部以檢查該變量是否位於本地命名空間中,而globals()則是全局命名空間。所以在哪個變量python中尋找這種情況。 –