ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python范围问题

2019-07-16 01:57:18  阅读:206  来源: 互联网

标签:python scoping


我有一个简单的例子:


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,
        print "local_var:", local_var[0]

        local_var[0] = "local"

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

func1()

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

标签:python,scoping
来源: https://codeday.me/bug/20190716/1473260.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有