1. 苏葳的备忘录首页
  2. 编程

一个Python特有的变量作用域问题

python 变量 作用域虽然书上特意列举过这个问题,但没想到实际使用中这么快就遇上且迷惘了好久。由于python变量的动态性,变量在赋值时会自动定义。与其它语言一样,全局变量在函数中可直接使用,不需特意声明。然而在函数中对一与全局变量同名的变量赋值时,默认创建的,却是一局部变量。这在某些情况上,会使Python解析器出现一些困扰。这种问题在传统强类型语言中却很难出现。在本人的代码中:

def f1():
     global a1
     a1=3
def f2():
     print a1
     a1=4
f1()
f2()

这几乎与书上例子同出一辙。将报(变量在使用之前未定义)的错误。若去掉a1=4一句,则程序运行正常。若去掉print a1一句,程序运行也正常。但两句共存,则报错。

原因即在于 print a1 自动适用LEGB法则,将a1作为全局变量解释,但其之后的a1=4却根据原则,重新定义了一个a1的局部变量。显然,在f2的同一作用域内,a1不可能既为全局又为局部,所以a1将作为局部变量来定义。那么位于a1=4之前的print a1一句,将访问的是一个还不存在的局部变量a1,当然会出错。

而根据本人的原意,是要打印和修改全局变量a1的值,所以解决方法是在print a1前面加上一句:global a1,将a1明确声明为全局变量。

原创文章,作者:苏葳,如需转载,请注明出处:https://www.swmemo.com/437.html

发表评论

邮箱地址不会被公开。 必填项已用*标注