我从一本书中读到了一些类似下面的代码,但没有解释。 如您所见,在调用函数之前,不存在任何变量。 但是在函数调用之后,var2被弹出表单堆栈并从我们的func_a命名空间中删除,就像我们期望的那样。但是,var1仍然存在!!!
如何解释这种现象? 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
答案 0 :(得分:3)
如何解释这种现象? var1是一种特殊的变量吗?
是的,var1
是一种特殊的变量。或许更准确地说,它根本不是变量。它是对象的属性(即使对象是函数)。该对象在函数调用之前存在,并且在之后继续存在。
在函数调用中,您将属性添加到全局对象,而不是在本地范围内创建变量。
答案 1 :(得分:2)
您将函数名称空间与函数对象混淆。在调用函数之前,var1
不存在。调用该函数时,python会为该调用创建一个临时本地名称空间。当函数命中var2 = 2
时,在本地函数名称空间中创建var2
。当函数命中func_a.var1 = 1
时,python在全局命名空间中查找func_a
,找到函数对象,并向其添加var1
。当函数退出时,本地命名空间消失但函数对象仍然存在,var1
也将存在。