为什么Python循环中修改列表会更新循环外的原变量?
问题原因
Python中的列表属于可变对象,你代码中所有通过=直接对列表赋值的操作,都只是给同一块内存地址的列表绑定新的变量名,不会生成独立的列表副本:
parentPos = self.pos没有复制列表,只是让parentPos和self.pos指向同一个列表childPos = parentPos同样没有复制列表,三个变量共享同一个列表数据
因此你修改childPos[i]时,本质是直接修改了原始的self.pos列表,导致后续循环的基准值被篡改,最终所有生成的EightQueen对象的pos属性都指向同一个被反复修改的列表,结果不符合预期。
修正代码
每次生成子位置时先对基准列表做浅拷贝,保证每次修改的都是独立的新列表:
def createChildren(self): # 先拷贝原始pos作为基准,避免修改原对象属性 parentPos = self.pos.copy() children_list = [] for i, element in enumerate(parentPos): for n in range(8): if element == n: continue # 每次生成子位置都先拷贝基准列表 childPos = parentPos.copy() childPos[i] = n children_list.append(EightQueen(childPos)) return children_list
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

