【问题标题】:Why didn't operations on a copy of a list also modify elements in the original list?为什么对列表副本的操作不会同时修改原始列表中的元素?
【发布时间】:2017-01-29 18:57:17
【问题描述】:

在 Python 中,一切都应该用指针来表示。因此,我希望以下代码也能修改原始列表 a,因为我认为列表 copy 将包含 a 中包含的所有原始指针:

import copy

a = ["a", "a"]

copy = copy.copy(a)
for (count, e) in enumerate(copy):
    copy[count] += "b"

print copy
print a

我希望看到["ab", "ab"]。令人惊讶的是,a 仍然包含 ["a", "a"],而 copy 确实包含 ["ab", "ab"]。使用copy = list(a) 也不起作用。

我认为这个结果只有在我写 copy = copy.deepcopy(a) 时才会发生。

我哪里做错了?获取对列表中所有元素的引用并在镜像列表中修改它们的正确方法是什么?还是在 Python 中是不可能的?

【问题讨论】:

  • 字符串是不可变的?
  • 字符串是不可变的。
  • @chepner 击败你 3 秒 :P
  • 是的。您没有修改对象。您只需创建新的,并将它们放入新列表中。字符串是不可变的——它们不能被修改。
  • @Zizouz212 我更愿意认为我回答你的问题非常快:)

标签: python list pointers reference copy


【解决方案1】:

你很困惑。使用copy.copy 的全部目的是创建一个不引用旧列表的新列表。如果您确实想保留参考,请不要复制它:

a = ["a", "a"]
copy = a

【讨论】:

  • 谢谢。这实际上回答了我的问题。那么在这种情况下copydeepcopy 之间应该有什么区别?
  • @JIXIang Copy 将创建一个新列表,但该列表中的所有元素都是相同的。 Deepcopy 也会尝试重新创建这些元素。
  • @JIXIang:除非列表中的元素是可变的,否则不会有实际区别,在这种情况下它们不是。
  • 不正确。 deecopy 完全删除了引用。 copy 将引用保存在 inside 列表中。以列表列表为例:修改已复制列表中的列表仍然会修改原始列表的内部列表。有很大的实际差异,否则我们本质上是在教错误的东西,例如,如果用户最终决定有一天编写 Java 并使用 char 数组而不是 String。编辑:没有看到@Zizouz212 的评论。
  • 另外值得注意的是,下面也复制了一份列表:li = list(['a', 'b'])
猜你喜欢
  • 1970-01-01
  • 2019-03-27
  • 1970-01-01
  • 2011-09-30
  • 1970-01-01
  • 2013-03-02
  • 1970-01-01
  • 2021-12-30
相关资源
最近更新 更多