【问题标题】:Does generating a list with multiplication produce references [duplicate]使用乘法生成列表是否会产生引用[重复]
【发布时间】:2013-04-26 00:51:20
【问题描述】:

当我这样做时:

cand = [ [ 0, 0 ] ] * 4

接着是:

cand[0][0] = 99

我明白了:

[[99, 0], [99, 0], [99, 0], [99, 0]]

乘法是否只是复制列表引用?有没有办法有不同的列表?

【问题讨论】:

  • 绝对是重复的
  • 这可能有兴趣bugs.python.org/issue12597
  • @HennyH“解决方案:无效”
  • @fusha 该帖子回答了您提出的问题。所以从一个尚未回答的问题开始。
  • @user2246674 我链接了那个页面,因为他们讨论了这个话题,不管它是否是一个错误,为什么会发生以及解决它的方法。

标签: python list


【解决方案1】:

它创建了对同一对象的四个引用。为了解决这个问题,您必须创建四个单独的列表:

cand = [[0, 0] for _ in range(4)]

【讨论】:

  • 谢谢,那么列表乘法有什么用呢?我必须更改我所有的代码:((
  • 另外,有没有办法在乘法后创建不同的列表?比如:cand = copy([ [ 0, 0 ] ] * 4) 这当然行不通。
  • @fusha:你必须这样做[copy(l) for l in cand]。至于* 的用处,它并不特定于列表。它也适用于元组,它们是不可变的并且没有这个问题。
  • @fusha 可能是[deepcopy(l) for l in cand],具体取决于您是否有嵌套列表副本。关于列表乘法有什么好处的问题的答案......当您发现自己使用这样的列表或矩阵时,您应该使用numpy
  • @jamylak,再次感谢,我只是想不出复制引用会派上用场的场景。
猜你喜欢
  • 2013-07-16
  • 2020-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-28
  • 2019-12-04
  • 2016-12-19
相关资源
最近更新 更多