【问题标题】:Python Scope ErrorPython 范围错误
【发布时间】:2017-03-03 16:37:50
【问题描述】:

此代码给出“未绑定错误”(在此查询中讨论 Python variable scope error

x=3
def f():
    print x
    x+=3

这样做的原因(如答案中所示)是,一旦使用赋值运算符,'x' 就成为局部变量,并且由于 'x' 没有附加值,因此无法将其增加 3。 但是看看这段代码

x=3
def f():
    print x
    x=3

这一次,'x' 似乎没有值,因此不应该有任何问题,但同样的错误发生了。

UnboundLocalError: local variable 'x' referenced before assignment

如果python在读取语句'x=3'后已经创建了一个局部变量'x',那为什么它不打印'x'?

这里还值得注意的是,这段代码不会产生错误

x=3
def f():
    print x
    x

输出为 '3'(当 f() 被调用时)

这让我很困惑,这次是不是在 'f()' 中声明了太多 'x' 那么 python 不应该将这个 'x' 添加到它的局部变量列表中吗?

【问题讨论】:

  • Python 编译你在函数中使用的变量名列表。这里将使用x,因此它已经为它“保留”了空间,但它没有被分配。

标签: python variables scope


【解决方案1】:

你链接的问题清楚地表明:

Python 对函数中变量的处理方式不同,具体取决于您是否在函数内为变量赋值

因此,在前两个示例中,您分配给变量 x - 无论您是在 print 语句之前还是之后执行此操作 - 这意味着存在一个局部变量 x

在上一个示例中,您 不分配给 xx 不是分配,只有 x =(或 x += 等)是分配。所以它是一个表达式。因此在最后一个示例中没有局部变量x,而是使用了函数范围之外的变量。

【讨论】:

  • 所以这意味着如果我不在函数定义中使用赋值运算符,那么该变量不会像第三种情况那样是局部变量?
  • @AnirudhRoy:确实,python 会在函数范围外寻找具有相同名称的变量。
【解决方案2】:

UnboundLocalError:赋值前引用了局部变量“x”

当解释器无法找到特定变量时会发生此错误(在这种情况下为 x) 因为它的范围。 定义 f(): 打印 x x=3 在上面的代码中,变量范围是正确的,但是解释器逐行读取代码,因此会导致这个错误

【讨论】:

    【解决方案3】:

    x的范围在f()之外

    打印在没有赋值的情况下工作,因为它假定您指的是外部作用域 x。如果你稍后尝试分配它,它会说“嘿,他一定是指这个,那个不对”

    x=3
    def f():
       print x
       print locals()
    
    
    f()
    3
    {}
    

    【讨论】:

      【解决方案4】:

      其他人已经向我们展示了原因。此外,您可能希望看到以下内容:

      x = 3
      
      def f():
          global x
          print(x)
          x += 3
      

      local 变量相比,由于某些原因,您可以使用global

      【讨论】:

      • 好吧,我当然知道,如果我想在函数之外更改“x”,我应该使用全局,但是我试图知道 python 如何准确地解释代码并完成执行。喜欢这里的问题stackoverflow.com/questions/42023636/…
      猜你喜欢
      • 2017-08-26
      • 1970-01-01
      • 1970-01-01
      • 2016-04-17
      • 2015-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多