python的命令行是什么,python的输出命令是什么
摄影:路易斯勒雷纳,unsplash.com
任何Python开发人员都会遇到至少一个UnboundLocalError错误。第一次遇到这种错误,我觉得很不可思议。用这幅图来表达当时的心情最合适不过了:
例如,以下代码使用foo函数将x递增1:
当x=10deffoo(:x=1print) x (foo))调用foo)时,在给局部变量x赋值之前,堆栈日志已经在其他地方被引用了,换句话说,x仍然定义在当前作用域内。
trace(mostrecentcalllast):file unbound test.py ,第8行,模块foo中)file unbound test . py ,第4行,Infoox=1 UnboundLocalError:局部变量 x ReferencedForeAssignment告诉我们,x是在函数foo之外定义的,但为什么没有赋值呢?
由于这是大多数人都会遇到的一个错误,Python官方在FAQ中包含了这个问题,并表示:
这是因为当您在scope中创建一个assignmentto variable时,该变量会变成localtothatscope和shadowsanyisimilarlynamedavariabled
翻译后,如果xydqd在局部范围内给一个变量赋值,这个变量就会变成局部变量,不管它是否在外部初始化。如果外部作用域有同名的变量,这些同名的全局变量将隐藏在局部空间中。
这里,x=1相当于x=x 1。首先执行x 1运算,然后代入x,另一方面,在执行加法运算之前查找变量x。根据公式的这个解释,Python认为X是函数foo的局部变量。因为有赋值操作。由于X是局部变量,所以在添加时会抛出UnboundLocalError异常,因为它引用了X。
那么,如何解决异常呢?这是一个简单的方法。Python提供了关键字globlal,用于显式地将X标识为全局变量。如果x被设置为一个全局变量,当执行附加操作时,将在全局命名空间中搜索x。
如果变量在局部范围内被直接引用而没有被重新分配给变量X,Python将根据legb(Local-Encapsulation-Global-Built-in)规则按顺序搜索变量。
Lst=[1,2,3] deffoo (:Lst.append) 5) #运行成功,lst没有重新赋值。首先在局部范围内搜索,如果找不到,就在全局范围内搜索lst。
def external(:x=10 def internal):x=1 print(x)internal))外部)这是一个Python闭包。当执行外部功能时
def external(3360 x=10 definternal):globalx=1 print)internal(external)中有新的错误。没有定义所有的nameerror3360global全局变量x。想想吧。是啊。x是在外部函数中定义的局部变量。现在将内部函数的x声明为全局变量。Python在全局作用域空间找不到X,所以出现了NameError。那么,如何解决这个问题呢?如果你用的是Python3,恭喜你。在Python3中,为非局部变量添加了关键字nolocal。
在dis.dis(foo)中,可以看到Python中字节码指令的执行过程。从字节码中可以看出,第三行代码x=x 1的指令是LOAD_FAST,LOAD_FAST) x是
3 LOAD _ FAST 0(x)3 LOAD _ CONST 1(1)1)6 in place _ ADD 7 STORE _ FAST 0(x)x)4 10 LOAD _ FAST 0(x)13 print _ x
这篇课文对你有帮助吗?分享给更多的人。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。