使用相同的变量附加python列表会导致在所有列表位置注册变量的新更改[重复]
Posted
技术标签:
【中文标题】使用相同的变量附加python列表会导致在所有列表位置注册变量的新更改[重复]【英文标题】:Appending python list using the same variable cause new changes to variable be registered in all list positions [duplicate] 【发布时间】:2021-11-18 04:05:57 【问题描述】:为了便于阅读和隔离主要问题,我总结了原始程序中的代码。 出于某种原因,当我将“boom”变量附加到“poss”(甚至 poss.copy()),然后对“poss”进行后续更改时,后续更改会以某种方式注册在原始列表中(“boom” )。我不希望这样,我希望繁荣成为一种记录保持变量,保持每种状态。我也不能导入库(所以我不能使用复制库中的 deepcopy() 等解决方案)。
poss= [
['*', 'j', '*', '*', '*'],
['*', '*', '*', '*', '*']
]
boom = [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(poss.copy())
#This should print two different values but it prints same
print("First and Second Generation:")
for boomite in boom:
print(boomite)
print("\n")
#Somehow the second and any successive changes are present in
#the previous generations
我得到输出:https://i.stack.imgur.com/cPpXL.png
【问题讨论】:
这能回答你的问题吗? How to make a copy of a 2D array in Python? 你不需要我们 copy.deepcopy (虽然说“我不能使用库”对于标准库来说确实是一个无意义的限制,但没关系)。只需为您的嵌套列表实现深层复制。这是微不足道的 【参考方案1】:你没有在boom
赋值中复制poss
,即使poss.copy()
也行不通,因为列表是嵌套的,所以不能浅拷贝,需要深拷贝它。
代替:
boom = [poss]
试试:
boom = [[x[:] for x in poss]]
或者copy.deepcopy
:
import copy
boom = [copy.deepcopy(poss)]
【讨论】:
以上是关于使用相同的变量附加python列表会导致在所有列表位置注册变量的新更改[重复]的主要内容,如果未能解决你的问题,请参考以下文章