首页 > 解决方案 > 为什么浅拷贝不影响列表中的单个元素?

问题描述

我正在使用浅拷贝将一个列表元素复制到另一个,当我尝试浅拷贝并通过更新它在父对象中更新的 dict 和列表元素的值进行检查时,列表包含 dict 和另一个列表元素,但是当我尝试更新未更新为父元素的单个元素。下面是我的代码:

import copy 

li1 = [{"a": 20}, 2, [3,5], 4] 
print ("Before shallow copy1 ", li1)
li2 = copy.copy(li1) 
li2[2][1] = 7
li2[1] = "C"
li2[0].update({"a": 30})
li2[3] = 50
print ("Aftr shallow copy 1", li1)
print ("Aftr shallow copy 2", li2)

# Output:
# Before shallow copy1  [{'a': 20}, 2, [3, 5], 4]
# Aftr shallow copy 1 [{'a': 30}, 2, [3, 7], 4]
# Aftr shallow copy 2 [{'a': 30}, 'C', [3, 7], 50]

这里改变了父列表中字典和列表(位置:0 和 2)元素的值,但单个元素(位置:1)的值没有改变。

标签: pythoncopy

解决方案


dict 元素发生了变化,因为您正在更新对象。

您的第二个元素不受影响,因为您正在重新分配一个新值。您正在做的是将一个新指针存储到您的列表中。这会更改存储在li2但不存储在li1.

您的第三个对象已更新,因为分配li2[2][1]不会更改li2[2]指向的列表。这意味着此处的指针未更新为指向新位置。所以你看到的东西li1会受到影响。

但是li2[3]是直接重新分配了列表中的那个位置。所以这意味着li1不受影响。


推荐阅读