Python类属性二维数组初始化失败,一维数组正常的原因咨询
问题原因与解决方案
为什么二维列表推导式报错?
这是Python类定义阶段的作用域规则导致的:
- 类体执行时会生成一个临时命名空间,但嵌套的列表推导式(内层的
for _ in range(num_states))会创建独立的局部作用域,这个作用域无法直接访问类体中定义的num_states——类属性在类完全创建完成前,无法被嵌套推导式内部的作用域引用。 - 而一维列表推导式是单层结构,它的作用域直接继承自类体的命名空间,因此能正常读取
num_states。
可行的修复方案
通过类名访问类属性:
类在定义过程中,类名已可被引用,内层推导式可以直接用类名访问num_states:class Phase: num_states = 15 transition_table = [[False for _ in range(Phase.num_states)] for _ in range(Phase.num_states)]使用临时局部变量中转:
在类体内将num_states赋值给一个临时局部变量,内层推导式使用这个变量:class Phase: num_states = 15 n = num_states transition_table = [[False for _ in range(n)] for _ in range(n)]用显式循环替代嵌套推导式:
避免嵌套推导式的作用域问题,用循环构建二维表:class Phase: num_states = 15 transition_table = [] for _ in range(num_states): transition_table.append([False] * num_states)注:这里
[False] * num_states是安全的,因为布尔值是不可变类型,不会出现子列表引用同一对象的问题。
内容的提问来源于stack exchange,提问作者Hongdan Wang
相关产品推荐
相关产品推荐

