python list数学索引变量

时间:2014-09-14 02:57:43

标签: python list math mutable

这是我想要的方式

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如何改变两个地方的值,即使我尝试使用深拷贝但是我很难理解如何得到答案。我确信这很明显,但我不知道用什么关键词来搜索解决方案,所以请帮助我。

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}}的列表切片,基本上是复制它。请注意,这是浅拷贝,而不是深拷贝。但是,由于您的列表仅包含数字,因此浅拷贝应该可以正常工作。