我跑到下面的代碼爲什麼這種不同的行爲?我對嗎?
global_var1 = 1
global_var2 = 2
def func():
print(global_var1)
print(global_var2)
global_var2 = 3
func()
它扔錯誤
Traceback (most recent call last):
File "/home/harish/PycharmProjects/try/scope.py", line 10, in <module>
func()
File "/home/harish/PycharmProjects/try/scope.py", line 7, in func
print(global_var2)
UnboundLocalError: local variable 'global_var2' referenced before assignment
但下面的代碼工作
__author__ = 'harish'
global_var1 = 1
global_var2 = 2
def func():
print(global_var1)
print(global_var2)
func()
我的期望是funcion func
調用時。它會尋找global_var1
,它不是本地的,所以它看起來在全球範圍內並打印它。 然後類似地,它會尋找global_var1
,它不是本地,所以它看起來在全球並打印它。那麼它會在localscope中創建一個變量global_var2
並分配3。
可能沒有像上面那樣完成,因爲在相同的功能範圍內,同一個變量global_var2
有不同的含義。直到第2行,它指的是全球性的,然後是當地的..我的猜測是否正確?
我知道函數def會在被調用之前執行(例如,這有助於在默認參數設置期間)..將掃描整個函數體嗎?它是如何工作的 ? python如何知道這個局部變量global_var2直到它被執行? –
@HarishKayarohanam我不明白你在說什麼。爲了創建一個函數對象,python必須編譯它的所有主體。編譯所有主體時,它會查找所有的分配,並發現所有局部變量的名稱。這個賦值是在第一次使用之後的事實並不意味着python並不知道函數中的某個地方有*賦值。簡單的事實是,這種賦值迫使變量在函數內的所有用途中都是局部的。期。 – Bakuriu
@HarishKayarohanam以這種方式思考:每個局部變量都在函數的開始處隱式地聲明。所以就像'f'是:'def f():local a;打印的(a); a = 2'。簡單地說'本地a'是隱含的,所以你不寫它。如果你把一個'global a'或'nonlocal''聲明放在它上面。 – Bakuriu