Python追加同一列表变量时所有元素同步变动的无库方案求问
问题根因
你遇到的是Python列表浅拷贝的典型问题:list.copy() 仅支持一层浅拷贝,你使用的二维列表中,外层列表执行copy()后得到的新对象仅外层是独立的,内层的每个子列表仍然和原列表的子列表指向同一块内存地址。你最初直接将poss的引用存入boom,后续追加的浅拷贝对象也共用内层子列表,因此修改poss的内层元素时,boom里所有历史元素都会同步变更。
无库解决方案
不用导入copy库也可以手动实现二维列表的深拷贝,每次存储状态时遍历外层列表,给每一行子列表单独做拷贝,再将新生成的外层列表存入boom即可,写法如下:
[row.copy() for row in poss]
修改后的可运行代码
poss= [ ['*', 'j', '*', '*', '*'], ['*', '*', '*', '*', '*'] ] # 首次存入时做二维深拷贝 boom = [[row.copy() for row in poss]] #first change poss[0][1],poss[1][3] = poss[1][3] , poss[0][1] #first print works well shows correct change print("First Generation:") for boomite in boom: print(boomite) print("\n") poss[1][3],poss[0][0] = poss[0][0] , poss[1][3] # 追加时也做二维深拷贝 boom.append([row.copy() for row in poss]) print("First and Second Generation:") for boomite in boom: print(boomite) print("\n")
修改后两次打印的状态会完全独立,后续对poss的修改不会影响已经存入boom的历史记录。
内容的提问来源于stack exchange,提问作者YasindeOfDulian
相关产品推荐
相关产品推荐

