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 |
没问题!但当我在
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 |
如我所见,
我的python版本:2.7.13
在启动脚本python解释器之前,先将其预编译到字节码中,当函数中看到"x2=22"时,它会将x2放入该函数的"局部"中,并将对x2的每个引用都视为对局部x2的引用,而不是全局的引用。但是,当您启动函数时,您不会给本地x2分配任何值,但是python仍然只查找本地x2,所以会得到错误。
我希望我能以可以理解的方式解释,为我不完美的英语感到抱歉。)
x2未在函数x的作用域中定义。尝试将"x2=22"移出if语句,它将正常工作。仅仅为了记录,做"如果错误"是完全无用的,并且正在使计算机做一个额外的计算。在这一小段代码中,它没有任何区别,但在较大的代码中,效率会有明显的差别。