Juniorboy 发表于 2023-8-4 11:43:47

深拷贝浅拷贝之难题

{:5_100:}
请问这个为什么e会随之d的改变而改变呀,浅拷贝不是指向同一个对象了吗

isdkz 发表于 2023-8-4 11:44:04

浅拷贝是指创建一个新的对象,但是新对象中的引用类型属性仍然指向原对象中的相应属性。当原对象中的引用类型属性发生改变时,浅拷贝的新对象中的相应属性也会随之改变。

在你提供的情况中,如果对象d进行了浅拷贝赋值给了对象e,那么e和d会指向同一个引用类型属性。因此,当你修改d中的引用类型属性时,e中的相应属性也会发生改变。

如果你希望e不随着d的改变而改变,你可以使用深拷贝。深拷贝会创建一个全新的对象,并且新对象中的引用类型属性也会被复制一份,而不是指向原对象中的相应属性。这样,当你修改原对象中的引用类型属性时,深拷贝的新对象不会受到影响。

以下是一个使用深拷贝的示例代码,你可以使用 copy.deepcopy() 函数来进行深拷贝:

import copy

d = {'key': }
e = copy.deepcopy(d)

d['key'].append(4)

print(d)# 输出: {'key': }
print(e)# 输出: {'key': }


在这个示例中,通过使用 copy.deepcopy() 函数,我们创建了一个新的对象e,并且e中的引用类型属性被复制了一份。因此,当我们修改d中的引用类型属性时,e不会受到影响。

歌者文明清理员 发表于 2023-8-4 11:51:04

浅拷贝:仅仅复制这个元素
a = ]
# 浅拷贝
b = a[:]
print(b is a) # False
print(a[-1] is b) # True,因为最后那个列表还是一样的
深拷贝需要用 deepcopy()
import copy
a = ]
b = copy.deepcopy(a)

现在回到你的问题:d变了,e没变

tommyyu 发表于 2023-8-4 11:52:42

浅拷贝是创建一个值相同的对象,用等号直接赋值才是同一个对象。

等号赋值:>>> a =
>>> b = a
>>> b

>>> a = 4
>>> b

>>> a

>>>

浅拷贝:>>> import copy
>>> a =
>>> b = copy.copy(a)
>>> # 浅拷贝
>>> a = 4
>>> a

>>> b

>>>
值得注意的是,如果改变列表对象中一个可变对象(比如列表)的值时,其浅拷贝也会发生变化。>>> import copy
>>> a = ]
>>> b = copy.copy(a)
>>> a.append(4)
>>> a
]
>>> b
]
>>> 但是使用深拷贝就不会有这个问题。>>> import copy
>>> a = ]
>>> b = copy.deepcopy(a)
>>> a.append(4)
>>> a
]
>>> b
]
>>>

歌者文明清理员 发表于 2023-8-4 11:55:07

tommyyu 发表于 2023-8-4 11:52
浅拷贝是创建一个值相同的对象,用等号直接赋值才是同一个对象。

等号赋值:


{:5_106:}
页: [1]
查看完整版本: 深拷贝浅拷贝之难题