加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-20 12:40:37 所属栏目:Python 来源:网络整理
导读:假设我有以下功能: def xplusy(x,y): return x+ydef xplus1(x): xplusy = xplusy(x,1) return xplusy 现在如果我调用= xplus1(4)它会抛出以下错误: UnboundLocalError: local variable 'xplusy' referenced before assignment 该错误是由于命名冲突,如果我
假设我有以下功能:

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

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

现在如果我调用= 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.不再引用原始函数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 "<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/

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读