使用相同的变量附加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列表会导致在所有列表位置注册变量的新更改[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中将多个变量附加到列表中

Python - 将函数附加到列表[重复]

附加到 R 中的列表会导致复制吗?

使用Python以相同的顺序获取列表的所有子列表[重复]

Python将变量附加到列表[关闭]

当 Python 只应附加到一个列表时,它会附加到两个列表