2016-09-29 133 views
1

我從一本關於如下代碼的書中讀到,但沒有解釋它。如您所見,在我調用函數之前,不存在變量。 但是在函數調用之後,var2被彈出窗體堆棧並從func_a的命名空間中移除,就像我們所期望的那樣。但是,var1仍然存在!爲什麼變量在函數調用完成後仍然存在-python

如何解釋這種現象? var1是一種特殊的變量嗎?

def func_a(): 
    func_a.var1 = 1 
    var2 = 2 

>>> func_a.var1 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'function' object has no attribute 'var1' 

>>> var2 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'var2' is not defined 

>>> func_a() 
>>> func_a.var1 
1 
>>> var2 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'var2' is not defined 

回答

4

如何解釋這一現象? var1是一種特殊的變量嗎?

是的,var1是一種特殊的變量。或者更準確地說,它根本不是一個變量。它是一個對象的屬性(即使該對象是一個函數)。該對象在函數調用之前就已存在,並在之後繼續存在。

在函數調用你是添加屬性到一個全局對象,而不是創造一個局部範圍的變量

+0

我覺得,這更像是一堂課。一個物體在沒有被他人引用時被收集爲物品,是嗎? –

+0

是的,一個對象在未被引用時被垃圾收集。 'var1' _is_被引用 - 'func_a'有一個引用。 –

2

您正在使函數名稱空間與函數對象混淆。在調用函數之前,var1不存在。當函數被調用時,python會爲該調用創建一個臨時的本地名稱空間。當函數命中var2 = 2時,在本地函數名稱空間中創建var2。當函數命中func_a.var1 = 1時,python在全局命名空間中查找func_a,查找函數對象,並將var1添加到它。當函數退出時,局部名稱空間消失,但​​函數對象仍然存在,var1也是如此。

相關問題