类变量函数在列表推导式中使用为何触发NameError?
Python类中列表推导式访问类属性的NameError问题
正常运行的代码
以下代码执行后输出[49],符合预期:
class A: func = lambda x: x+4 added_values = [func(45)] if __name__=="__main__": print(A.added_values)
触发错误的代码
但使用列表推导式的代码会抛出NameError:
class A: func = lambda x: x+4 added_values = [func(45) for _ in range(1)] if __name__=="__main__": print(A.added_values)
报错信息:
Traceback (most recent call last): File "/home/yeti/Documents/PycharmProjects/pythonProject/main.py", line 1, in <module> class A: File "/home/yeti/Documents/PycharmProjects/pythonProject/main.py", line 3, in A added_values = [func(45) for _ in range(1)] File "/home/yeti/Documents/PycharmProjects/pythonProject/main.py", line 3, in <listcomp> added_values = [func(45) for _ in range(1)] NameError: name 'func' is not defined
原因解析
核心问题出在Python列表推导式的作用域规则:
- 直接创建列表
[func(45)]时,代码处于类体的命名空间中,Python会直接在当前类的作用域内查找func,因此能正常找到定义的lambda函数。 - 列表推导式在Python 3中是一个隐式的嵌套函数,拥有独立的局部作用域。推导式内部查找名称时,只会先查自己的局部作用域,再查全局作用域,不会去类的命名空间中查找,所以找不到
func,触发NameError。
解决方法
有几种可行的修正方式:
- 通过类名直接访问属性:
class A: func = lambda x: x+4 added_values = [A.func(45) for _ in range(1)]
- 将类属性赋值给类体中的局部变量,再在推导式中使用:
class A: func = lambda x: x+4 local_func = func added_values = [local_func(45) for _ in range(1)]
- 改用类体循环构建列表(循环执行在类作用域内):
class A: func = lambda x: x+4 added_values = [] for _ in range(1): added_values.append(func(45))
内容的提问来源于stack exchange,提问作者HaoZhang
相关产品推荐
相关产品推荐

