为什么变量在函数调用完成后仍然存在-python

时间:2016-09-29 03:24:50

标签: python python-2.7

我从一本书中读到了一些类似下面的代码,但没有解释。 如您所见,在调用函数之前,不存在任何变量。 但是在函数调用之后,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

2 个答案:

答案 0 :(得分:3)

  

如何解释这种现象? var1是一种特殊的变量吗?

是的,var1是一种特殊的变量。或许更准确地说,它根本不是变量。它是对象的属性(即使对象是函数)。该对象在函数调用之前存在,并且在之后继续存在。

在函数调用中,您将属性添加到全局对象,而不是在本地范围内创建变量

答案 1 :(得分:2)

您将函数名称空间与函数对象混淆。在调用函数之前,var1不存在。调用该函数时,python会为该调用创建一个临时本地名称空间。当函数命中var2 = 2时,在本地函数名称空间中创建var2。当函数命中func_a.var1 = 1时,python在全局命名空间中查找func_a,找到函数对象,并向其添加var1。当函数退出时,本地命名空间消失但函数对象仍然存在,var1也将存在。