【问题标题】:Python 2.7.6 variables scoping: strange behaviorPython 2.7.6 变量作用域:奇怪的行为
【发布时间】:2016-04-20 13:56:30
【问题描述】:

我写了一个示例代码:

def fun():
    print x
    l = [x for x in range(100)]
    print x

x = 1
fun()

它给出了这个错误:

Traceback (most recent call last):
  File "scope.py", line 7, in <module>
    fun()
  File "scope.py", line 2, in fun
    print x
UnboundLocalError: local variable 'x' referenced before assignment

但是如果我这样注释掉第三行:

def fun():
    print x
    #l = [x for x in range(100)]
    print x

x = 1
fun()

打印出来:

1
1

那里发生了什么?为什么l = [x for x in range(100)]fun()中有这样的效果?

【问题讨论】:

  • 因为列表理解是对x 的隐式赋值;请注意,这不会在 3.x 中发生,其中列表推导有自己的范围。

标签: python scope global-variables


【解决方案1】:

您遇到此问题的原因是由于 python 查找变量(闭包)的方式。首先,当您从x = 1 开始时,fun() 外部的 x 为 1,但 fun() 内部没有“x”,因此该函数然后查看函数外部并看到 x = 1 以获取值。当您执行l = [x for x in range(100)] 时,您还没有初始化变量 x 来运行循环,因此它无法编译(即它不会在函数外部查看并说 x 未定义)

【讨论】:

  • 如果要访问与本地同名的全局变量,请在访问变量前使用global var_name引用全局变量。
  • 他可以@user161151 但一般不建议这样做,因为它容易出现下游错误和错误,代码异味
  • 我还是不太明白。 Python代码不是在执行过程中逐行编译的吗?那么为什么下一行中的列表理解会破坏print x 之前的变量分辨率?还是fun()函数先完全编译后才运行?
猜你喜欢
  • 1970-01-01
  • 2014-10-09
  • 1970-01-01
  • 1970-01-01
  • 2011-12-05
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
  • 2014-06-05
相关资源
最近更新 更多