在 Python 中,函数是数据,而类型是动态的。这意味着以下行是有效的 Python:
def func(x):
return x + 3
func = 3
func
现在是一个整数。原来的功能func
不再引用。事实是func
最初是一个函数,与将来可以分配给它的数据类型无关。 (这就是“动态类型”的含义。)
因此,由于没有静态类型,并且“函数”是有效的数据类型,因此 Python 解释器区分函数和同名引用的数据是没有意义的。因此,在给定范围内,无法使用相同的非限定变量名来表示两个不同的事物。
在您的特定情况下,如果您的代码xplus1
函数意味着任何东西,它意味着“计算xplusy(x,1)
并分配该值到变量xplusy
——从而失去了对function xplusy
。”但是,在函数的作用域内,解释器不会让您对该作用域之外的变量进行赋值,因此它假设通过编写赋值语句,您正在引入一个新的局部变量xplusy
。然而,局部变量尚未定义,因此您尝试调用它,xplusy(x,1)
,失败。全局定义的函数不会作为后备调用,因为同样,您不能让两个非限定名称相同并指向同一范围内的不同数据。
另一个例子演示了“一个范围内变量名不重复”的规则(实际上我只是在尝试构造这个答案时使用提示时才发现的):
>>> def f1():
... a = xplusy(3,4)
... xplusy = 5
... print xplusy
...
>>> f1()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in f1
UnboundLocalError: local variable 'xplusy' referenced before assignment
>>> def f1():
... a = xplusy(3,4)
... print a
...
>>> f1()
7
这证明它确实是scope,不是陈述这需要唯一的名称。
编辑:这是一篇非常酷的帖子,解释了这个以及其他与范围相关的行为:http://me.veekun.com/blog/2011/04/24/gotcha-python-scoping-closures/