【问题标题】:Python weird variable scope issuePython奇怪的变量范围问题
【发布时间】:2013-11-18 11:52:59
【问题描述】:

我的代码如下。

def test():
   print num1
   print num
   num += 10

if __name__ == '__main__':
   num = 0
   num1 = 3
   test()

执行上述 python 代码时,我得到以下输出。

3 
Traceback (most recent call last):
File "<stdin>", line 3, in <module>
File "<stdin>", line 2, in test
UnboundLocalError: local variable 'num' referenced before assignment

我不知道为什么特别是 num 在测试方法中不可用。这对我来说很奇怪,我之前还没有遇到过。

注意:我使用的是 python 2.7。

【问题讨论】:

  • 假设你缩进正确,这段代码可以工作。请再次检查您是否显示了引发此错误的确切代码,您可能在某处有错字。
  • @delnan 我在上次编辑的地方使用了 num 变量。希望它在代码中出错。你能看一下上面的代码吗?
  • UnboundLocalError in Python 的可能重复项
  • 看,现在很简单。如果您从一开始就包含了正确的代码(甚至只是异常消息),那么您会早一个小时得到答案;-)
  • 酷,您的编辑让我投了反对票,因为我的回答不再有效。

标签: python python-2.7 scope


【解决方案1】:

num 出现在test 定义内的赋值语句中。这使得num 成为局部变量。由于作用域是在编译时确定的,所以num 是一个局部变量,即使在赋值之前的print 语句中也是如此。当时num没有值,导致报错。如果要访问全局值,则需要将 num 声明为全局值。 num1 没有这个问题,因为你从来没有尝试分配给它。

def test():
    global num
    print num1
    print num
    num += 10

【讨论】:

    【解决方案2】:

    由于您在test 函数内分配给num,python 认为它是一个局部变量。这就是为什么它抱怨你在分配它之前引用了一个局部变量。

    您可以通过将num 明确声明为全局来解决此问题:

    def test():
        global num
        print num1
        print num
        num += 10
    
    if __name__ == '__main__':
        num = 0
        num1 = 3
        test()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-21
      • 2012-04-02
      • 2014-09-24
      • 1970-01-01
      • 2012-06-17
      • 1970-01-01
      相关资源
      最近更新 更多