这是我想要的方式
a = [1,8,10]
b = list([a])
a = [0,8,10]
b.append(a)
a = [0,0,10]
b.append(a)
print(b)
给我我想要的清单:
[[1,8,10],[0,8,10],[0,0,10]]
我需要使用基于列表索引的变量来更改值,如
a = [1,8,10]
b = list([a])
a[0] = a[0] - 1
b.append(a)
print(b)
我得到了这个结果:
[[0, 8, 10], [0, 8, 10]]
我的全部观点是跟踪我创建nim游戏的动作。我想我看到设置一个[0] = a [0] - 1如何改变两个地方的值,即使我尝试使用深拷贝但是我很难理解如何得到答案。我确信这很明显,但我不知道用什么关键词来搜索解决方案,所以请帮助我。
答案 0 :(得分:3)
使用deepcopy应该可行 - 我怀疑你只是在错误的地方使用它。
使用单个列表作为模板的危险就像使用a
一样,如果你改变它,你最终可能会更改已经附加到b
的列表。解决此问题的一种方法是,只要您想要更改它,就始终创建a
的新副本。
import copy
b = []
a = [1,8,10]
b.append(a)
a2 = copy.deepcopy(a)
a2[0] = a2[0] - 1
b.append(a2)
print(b)
另一种方法是,只要将a
附加到b
,就可以复制import copy
b = []
a = [1,8,10]
b.append(copy.deepcopy(a))
a[0] = a[0] - 1
b.append(copy.deepcopy(a))
print(b)
,这样您就不必继续创建新变量:
b
这两种不同方法之间的共同点是,我们总是在一次之后附加任何给定列表。在您的代码中,您将同一列表多次附加到a
。这意味着每当您更改b
时,就会在b
中更改所有内容。
在我提供的两个示例中,我只添加一个一次列表,如果需要进行更改则复制它。通过这样做,我确保a2 = a[:]
中的每个列表都是唯一的,并避免遇到您遇到的问题。
作为旁注,另一种创建列表副本的方法是a[:]
。 a
告诉Python从列表的开头到结尾获取{{1}}的列表切片,基本上是复制它。请注意,这是浅拷贝,而不是深拷贝。但是,由于您的列表仅包含数字,因此浅拷贝应该可以正常工作。