2017-06-05 61 views
1

代碼第一:命名空間中的理解與蟒蛇如果和別的

# case01 
def x(): 
    if False: 
     #x2 = 22 
     print x1 
    else: 
     print x2 

if __name__ == '__main__': 
    if False: 
     x1 = 1 
    else: 
     x2 = 2 
    x() 

case01的輸出:

2 

沒問題!但是當我在if False:塊並重新運行取消註釋#x2 = 22,就會得到錯誤:

--------------------------------------------------------------------------- 
UnboundLocalError       Traceback (most recent call last) 
<ipython-input-4-e36cb32b2c83> in <module>() 
    11  else: 
    12   x2 = 2 
---> 13  x() 

<ipython-input-4-e36cb32b2c83> in x() 
     4   print x1 
     5  else: 
----> 6   print x2 
     7 
     8 if __name__ == '__main__': 

UnboundLocalError: local variable 'x2' referenced before assignment 

我看到,if False:塊不會EXCUTE,但爲什麼x2 = 22採取劇本我又寫道一定的影響?

我的Python版本:2.7.13

+1

因爲賦值用於確定變量的範圍。你使'x2'成爲本地。 –

回答

2

之前啓動腳本Python解釋器預編譯它的字節碼,當它看到「×2 = 22」的功能,它把X2在__locals__該功能,並考慮每個裁判到x2的本地x2而不是全球的x2。但是當你開始你的函數時,你不會爲本地x2賦值,但Python仍然只查找本地x2,所以你會得到錯誤。

我希望我理解的方式,對不起,我不完美的英語)))

+0

謝謝!我明白你的意思了! – CodeUnsolved

0

X2未在函數x的範圍限定解釋。嘗試從if語句中移出「x2 = 22」,它會正常工作。只是爲了記錄,做「如果假」是完全沒有用的,並且正在使計算機做額外的計算。在這個小代碼中,它沒有區別,但是在更大的代碼中,效率會有明顯的差異。