在Python中,函数是数据,输入是动态的。这意味着以下行是有效的Python:def func(x):
return x + 3
func = 3
func现在是一个int。原来的函数func不再被引用。原来func是一个函数这一事实与将来可以分配给它的数据类型没有任何关系。(这就是“动态键入”的意思。)
因此,由于没有静态类型,而且“function”是有效的数据类型,所以Python解释器无法区分函数和由相同名称引用的数据片段。因此,在给定的范围内,不可能使用相同的非限定变量名来表示两个不同的东西。
在您的特定情况下,如果xplus1函数中的代码有任何意义,则意味着“计算xplusy(x,1)的值并将该值赋给变量xplusy,从而失去对函数xplusy的引用。”,解释器不允许您对超出该范围的变量进行赋值,因此它假定通过编写赋值语句,您将引入一个新的局部变量xplusy。但是,局部变量还没有定义,所以您尝试调用它xplusy(x,1)失败。全局定义的函数不能作为回退调用,因为同样,不能让两个不合格的名称相同并指向同一范围内的不同数据。
另一个示例演示了“在一个作用域内不重复变量名”规则(实际上,我只是在尝试构造此答案时使用提示时才发现该规则):>>> def f1():
... a = xplusy(3,4)
... xplusy = 5
... print xplusy
...
>>> f1()
Traceback (most recent call last):
File "", line 1, in
File "", line 2, in f1
UnboundLocalError: local variable 'xplusy' referenced before assignment
>>> def f1():
... a = xplusy(3,4)
... print a
...
>>> f1()
7
这表明真正需要唯一名称的是作用域,而不是语句。