用if和else命名python中的空间理解

name space comprehension in python with if and else

本问题已经有最佳答案,请猛点这里访问。

代码第一:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# case01
def x():
    if False:
        #x2 = 22
        print x1
    else:
        print x2

if __name__ == '__main__':
    if False:
        x1 = 1
    else:
        x2 = 2
    x()

案例01的输出:

1
2

没问题!但当我在if False:块中取消#x2 = 22的注释并重新运行时,会得到错误:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
---------------------------------------------------------------------------
UnboundLocalError                         Traceback (most recent call last)
<ipython-input-4-e36cb32b2c83> in <module>()
     11     else:
     12         x2 = 2
---> 13     x()

<ipython-input-4-e36cb32b2c83> in x()
      4         print x1
      5     else:
----> 6         print x2
      7
      8 if __name__ == '__main__':

UnboundLocalError: local variable 'x2' referenced before assignment

如我所见,if False:块不会开脱,但为什么x2 = 22会对我感兴趣的脚本产生一些影响?

我的python版本:2.7.13


在启动脚本python解释器之前,先将其预编译到字节码中,当函数中看到"x2=22"时,它会将x2放入该函数的"局部"中,并将对x2的每个引用都视为对局部x2的引用,而不是全局的引用。但是,当您启动函数时,您不会给本地x2分配任何值,但是python仍然只查找本地x2,所以会得到错误。

我希望我能以可以理解的方式解释,为我不完美的英语感到抱歉。)


x2未在函数x的作用域中定义。尝试将"x2=22"移出if语句,它将正常工作。仅仅为了记录,做"如果错误"是完全无用的,并且正在使计算机做一个额外的计算。在这一小段代码中,它没有任何区别,但在较大的代码中,效率会有明显的差别。