Python列表数学索引变量
作者:互联网
这是我想要的方式
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]]
我的全部目的是跟踪创建尼姆游戏的动作.我想我看到设置a [0] = a [0]-1会如何在两个地方都改变值,即使我尝试使用深度复制也是如此,但我对如何获得答案感到困惑.我敢肯定它很明显,但是我不知道该使用什么关键词来寻找解决方案,所以请帮助我.
解决方法:
使用Deepcopy应该可以工作-我怀疑您只是在错误的地方使用它.
与使用a一样,将单个列表用作模板的危险在于,如果对它进行突变,最终可能会更改已经附加到b的列表.解决此问题的一种方法是,无论何时要更改它,都始终创建一个新副本.
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时复制a,这样就不必继续创建新变量:
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 [:]告诉Python获取从列表的开头到结尾的列表片段,本质上是复制它.请注意,这是浅表副本,而不是深表副本.但是,由于列表仅包含数字,因此浅表副本应该可以正常工作.
标签:list,mutable,python,math 来源: https://codeday.me/bug/20191121/2050474.html