【问题标题】:Reassigning element of a list inside a list [duplicate]重新分配列表中的列表元素[重复]
【发布时间】:2014-12-31 22:49:17
【问题描述】:

我正在尝试修改列表列表:

list = [['0', '0', '0', '0', '0', '0'], ['0', '0', '0', '0', '0', '0'], ['0', '0', '0', '0', '0', '0'], ['0', '0', '0', '0', '0', '0'], ['0', '0', '0', '0', '0', '0']]

特别是当我分配list[0][1]='X' 时,list 现在是:

[['0', 'X', '0', '0', '0', '0'], ['0', 'X', '0', '0', '0', '0'], ['0', 'X', '0', '0', '0', '0'], ['0', 'X', '0', '0', '0', '0'], ['0', 'X', '0', '0', '0', '0']]

它不只是重新分配第一个子列表的第二个元素,而是重新分配每个子列表的第一个元素。我不明白为什么会这样。有人知道吗?

【问题讨论】:

标签: python list variable-assignment


【解决方案1】:

您必须像这样创建list

list = [['0', '0', '0', '0', '0', '0']] * 5

这样做会创建一个包含五个引用相同列表对象的列表:

>>> list = [['0', '0', '0', '0', '0', '0']] * 5
>>> id(list[0])
27391360
>>> id(list[1])
27391360
>>> id(list[2])
27391360
>>>

因此,当您修改一个子列表时,它们都会被更改。


要解决此问题,请改用list comprehension

lst = [['0', '0', '0', '0', '0', '0'] for _ in range(5)]

与您当前的代码不同,此解决方案将创建一个包含五个唯一子列表的列表。因此,更改一个不会影响其他的。

另外,我将您的列表名称更改为lst,以避免影响built-in。切勿创建与内置名称相同的名称。


注意你也可以写:

lst = [['0'] * 6 for _ in range(5)]

在这里执行['0'] * 6 不是问题,因为字符串在Python 中是immutable objects。因此,['0'] * 6 创建了一个包含六个唯一字符串对象的列表。但是列表是mutable objects,因此不能这样创建。

【讨论】:

  • lst = [ 6*['0'] for _ in range(5) ] 更简洁。
  • @khelwood - 好主意。我会提到它。
  • 谢谢大家,问题解决了。一个问题。如果列表 ['0', '0', '0', '0', '0', '0'] 并不总是相同但它存储在某个变量a中,你如何重写部分“为 _ in ...”?
  • @JavierRabba - 您可以通过将列表放入 list: lst = [list(a) for _ in range(5)] 来制作列表的副本。虽然我个人可能会使用切片符号:lst = [a[:] for _ in range(5)]。它对某些人来说可能不那么可读,但它更简洁,通常更快。
  • 完美。很喜欢
猜你喜欢
  • 1970-01-01
  • 2015-08-18
  • 2023-04-05
  • 1970-01-01
  • 2013-01-30
  • 2015-10-02
  • 2020-12-21
  • 2018-05-08
相关资源
最近更新 更多