【问题标题】:Why does this code change only some elements of the list and not the others?为什么此代码仅更改列表的某些元素而不更改其他元素?
【发布时间】:2019-10-16 04:44:11
【问题描述】:

我不明白为什么下面代码的结果是[1,[2,5]] 而不是[3,[2,5]]。为什么子列表中的元素发生了变化,而子列表之外的元素却没有?

我是 Python 新手,所以也许我看不到应该很明显的东西。我读过关于深拷贝和浅拷贝的文章,但没有帮助。

a = [1,[2,3]]
b = a[:]
a[0] = 3
a[1][1] = 5
print(b)

我在第 2 行创建了列表切片。但由于它没有开始或结束值,切片等于整个列表,对吗?那为什么 3 变成 5,而 1 还是一样呢?

【问题讨论】:

  • 这是一个副本,a[1] 仍然是原始(可变)列表。
  • 浅拷贝创建一个新容器,但仍将引用放在新容器/列表中。如果您希望确保不保留任何引用,请进行深度复制。
  • 我至少看过一本书和几个在线资源声称b = a[:] 是深拷贝——他们错了。见标准库copy.deepcopy()docs.python.org/3.7/library/copy.html

标签: python list slice


【解决方案1】:

因为,在 Python 中,每个列表都是一个独立的对象。 您可以使用“复制”模块进行深度复制来解决这个特定问题。

import copy
a = [1,[2,3]]
b = copy.deepcopy(a)
a[0] = 3
a[1][1] = 5
print(b)

结果:[1, [2, 3]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-17
    • 2011-08-22
    • 2021-09-22
    • 2017-01-06
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多