今天遇到一个问题,感觉挺有意思,记录一下
如果将外部定义的变量作为参数传入函数中后,没有赋值语句对该变量进行赋值,无报错
>>> a = 10
>>> def foobar():
... print(a)
>>> foobar()
而如果将外部定义的变量作为参数传入函数中后,接一个赋值语句,对该变量再进行赋值就会导致报错
>>> a = 10
>>> def foobar():
... print(a)
... a = 1
>>> foobar()
---------------------------------------------------------------------------
UnboundLocalError Traceback (most recent call last)
in
----> 1 foobar()
in foobar()
1 def foobar():
----> 2 print(a)
3 a = 1
UnboundLocalError: local variable 'a' referenced before assignment
UnboundLocalError: local variable 'a' referenced before assignment
这句报错信息需要关注:
这是由于如果函数中没有赋值语句,则a会被当作global变量;一旦函数中出现了赋值语句(a = 1),则被赋值的变量(a)就会被当作local变量,而打印该函数的local()后发现字典中没有该变量(a),因而在解释器解析代码的时候在print(a)处就会找不到该变量引用的对象,导致报错。
通过global关键字将a变为全局变量就能解决问题
>>> a = 10
>>> def foobar():
... global a
... print(a)
... a = 1
>>> foobar()
参考:
https://realpython.com/python-namespaces-scope
https://vbsreddy1.medium.com/unboundlocalerror-when-the-variable-has-a-value-in-python-e34e097547d6