1. 程式人生 > >Python決定一個變量時局部的,還是全局的,是在編譯期

Python決定一個變量時局部的,還是全局的,是在編譯期

CA () uri size reference 運行 int imp 因此

Python中的變量名是在編譯時就解析好的,換句話說,在編譯時(也就是在交互控制臺輸入代碼是或者import文件時),Python就已經決定一個變量應該是局部變量,還是全局變量。來看下面的例子:

>>>X = 99
>>>def test():
    print(X)


>>>test()
99

函數test裏面引用的變量,根據作用域鏈查找法則(LEGB法則),查找到的是全局變量X的值。

>>>X = 99
>>>def test():
    print(X)
    X = 88


>>>test()
UnboundLocalError:local variable 
X referenced before assignment # 報錯

根據文章開頭所說,Python決定一個變量時局部的,還是全局的,是在編譯期,當編譯到函數test時,看到了X = 88的賦值語句,因此,Python認為X在函數test裏面應該是一個局部變量,所以,當test函數運行時,執行print(X)語句,發現局部變量X未賦值就被引用了,所以報錯了。

事實上,在函數體內進行的任何賦值操作,包括=,import,嵌套的def定義,嵌套的class定義,等等,都會產生局部變量。在Python函數內部,局部變量和全局變量是無法共存的,只能存在一種:

>>>X = 99
>>>def
test(): X = 88 global X >>>test() >>>X # 輸出的是88 88

在上面的例子中,Python在編譯函數test的時,首先看到賦值語句X = 88,認定X應該是局部變量,但是,當繼續往下時,發現了global X語句,這將X聲明成了一個局部變量,因此,Python最終將test函數內部的X變量認定成一個全局變量,並最終運行時,改變了全局變量X的的值,最後打印的結果為88。

需要註意的是,如果global的聲明晚於變量的使用,Python會產生警告:SyntaxWarning:name ‘X‘ is assign to before global declaration

Python決定一個變量時局部的,還是全局的,是在編譯期