gpt4 book ai didi

python - python中冲突的变量和函数名称

转载 作者:太空宇宙 更新时间:2023-11-03 12:14:30 25 4
gpt4 key购买 nike

假设我有以下功能:

def xplusy(x, y):
return x+y

def xplus1(x):
xplusy = xplusy(x, 1)
return xplusy

现在,如果我调用 a = xplus1(4),它会抛出以下错误:

UnboundLocalError: local variable 'xplusy' referenced before assignment

错误是因为命名冲突,如果我重新定义xplus1如下:

def xplus1(x):
s = xplusy(x, 1)
return s

它工作正常。

为什么会这样:编译器不能正确区分变量和函数调用?

有什么解决办法吗?

最佳答案

在 Python 中,函数是数据,类型是动态的。这意味着以下行是有效的 Python:

def func(x):
return x + 3

func = 3

func 现在是一个 int。不再引用原始函数 funcfunc 最初是一个函数这一事实与将来可以分配给它的数据类型没有任何关系。 (这就是“动态类型”的意思。)

因此,由于没有静态类型,并且“函数”是一种有效的数据类型,Python 解释器区分函数和同名引用的一段数据是没有意义的。因此,在给定范围内,无法使用相同的非限定变量名来表示两个不同的事物。

在您的特定情况下,如果您的 xplus1 函数中的代码有任何意义,它将意味着“计算 xplusy(x,1) 的值并分配 that value 到变量 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

这表明它确实是作用域,而不是语句需要唯一名称。


编辑:这是一个非常酷的帖子,解释了这个和其他与范围相关的行为:http://me.veekun.com/blog/2011/04/24/gotcha-python-scoping-closures/

关于python - python中冲突的变量和函数名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16140986/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com