在我写下以下代码后:
if isinstance(lst, (list, tuple)) and len(lst) > 0:
lst = [v.lower() for v in lst]
pv_on, uv_on = 'pv'in lst, 'uv' in lst
PyCharm中的输出错误:NameError: name 'lst' is not defined
但如果我在lst2
内使用[v.lower() for v in lst]
而不是'lst',如下所示,它运作正常。我只是想知道原因。
if isinstance(lst, (list, tuple)) and len(lst) > 0:
lst2 = [v.lower() for v in lst]
pv_on, uv_on = 'pv'in lst2, 'uv' in lst2
更新
也许是装饰师造成的,
测试代码:
lst = ['A', 'B', 'C']
def record_deco(lst):
def _wrapper(func):
def wrapper(*args,**kwargs):
if isinstance(lst, (list, tuple)) and len(lst) > 0:
lst = [v.lower() for v in lst]
a_on, b_on = 'a' in lst, 'b' in lst
print a_on
print b_on
return func(*args, **kwargs)
return wrapper
return _wrapper
@record_deco(['a'])
def a(x):
print x
a('xxx')
这次我使用sublime,输出错误是:UnboundLocalError: local variable 'lst' referenced before assignment
将lst
更改为lst2
后,此错误消失。
答案 0 :(得分:2)
lst = ['A', 'B', 'C']
lst = [v.lower() for v in lst]
a_on, b_on = 'a' in lst, 'b' in lst
a_on, b_on
(True, True)
适合我。令人费解。
答案 1 :(得分:2)
如果在函数中的任何位置分配变量,Python会将函数中该变量的所有使用视为局部变量。由于您在lst
中分配了wrapper
,因此它被视为wrapper
的本地。这意味着当您执行lst = [v.lower() for v in lst]
时,本地变量lst
已经存在,因此可以迭代。但是不存在 local 变量lst
,因此会引发错误。您可以通过搜索Stackoverflow for UnboundLocalError找到许多其他问题。
正如您已经发现的那样,解决方案是为内部变量使用不同的名称。 (在Python 3中,您可以使用nonlocal lst
将lst
标记为从封闭的record_deco
函数中使用,但由于您不使用{{1除了嵌套函数之外。)