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

Python范围问题

发布时间:2020-12-20 12:15:37 所属栏目:Python 来源:网络整理
导读:我有一个简单的例子: def func1(): local_var = None def func(args): print args,print "local_var:",local_var local_var = "local" func("first") func("second")func1() 我希望输出为: first local_var: Nonesecond local_var: local 但是,我的实际输
我有一个简单的例子:

def func1():
    local_var = None

    def func(args):
        print args,print "local_var:",local_var

        local_var = "local"

    func("first")
    func("second")

func1()

我希望输出为:

first local_var: None
second local_var: local

但是,我的实际输出是:

first local_var:
Traceback (most recent call last):
  File "test.py",line 13,in 
    func1()
  File "test.py",line 10,in func1
    func("first")
  File "test.py",line 6,in func
    print "local_var:",local_var
UnboundLocalError: local variable 'local_var' referenced before assignment

我对python范围规则的理解要求它应该按预期工作.我有其他代码,这可以按预期工作,但减少一个非工作代码片段到它上面的小部分情况也不起作用.所以我很难过.

解决方法

在func中对local_var的赋值使其成为func的本地 – 所以print语句在它被赋值之前引用了“非常非常本地”的变量,正如异常所说的那样.正如jtb所说,在Python 3中你可以使用非本地解决这个问题,但是从代码中可以清楚地看到,你在Python 2中使用print语句.Python 2中的传统解决方案是确保赋值不是一个简单名称,因此不会使变量更加局部,例如:

def func1():
    local_var = [None]

    def func(args):
        print args,local_var[0]

        local_var[0] = "local"

    func("first")
    func("second")

func1()

索引的赋值不是一个简单名称,因此不影响局部性,并且从Python 2.2开始,嵌套内部函数引用外部包含函数中的本地变量是完全可以接受的,这是所有这个版本所做的(分配给裸名是一个与引用变量不同的问题).

(编辑:李大同)

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

    推荐文章
      热点阅读