You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

类变量函数在列表推导式中使用为何触发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。

解决方法

有几种可行的修正方式:

  1. 通过类名直接访问属性:
class A:
    func = lambda x: x+4
    added_values = [A.func(45) for _ in range(1)]
  1. 将类属性赋值给类体中的局部变量,再在推导式中使用:
class A:
    func = lambda x: x+4
    local_func = func
    added_values = [local_func(45) for _ in range(1)]
  1. 改用类体循环构建列表(循环执行在类作用域内):
class A:
    func = lambda x: x+4
    added_values = []
    for _ in range(1):
        added_values.append(func(45))

内容的提问来源于stack exchange,提问作者HaoZhang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 23:50:33