深拷贝浅拷贝之难题
{:5_100:}请问这个为什么e会随之d的改变而改变呀,浅拷贝不是指向同一个对象了吗 浅拷贝是指创建一个新的对象,但是新对象中的引用类型属性仍然指向原对象中的相应属性。当原对象中的引用类型属性发生改变时,浅拷贝的新对象中的相应属性也会随之改变。
在你提供的情况中,如果对象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不会受到影响。 浅拷贝:仅仅复制这个元素
a = ]
# 浅拷贝
b = a[:]
print(b is a) # False
print(a[-1] is b) # True,因为最后那个列表还是一样的
深拷贝需要用 deepcopy()
import copy
a = ]
b = copy.deepcopy(a)
现在回到你的问题:d变了,e没变 浅拷贝是创建一个值相同的对象,用等号直接赋值才是同一个对象。
等号赋值:>>> 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
]
>>> tommyyu 发表于 2023-8-4 11:52
浅拷贝是创建一个值相同的对象,用等号直接赋值才是同一个对象。
等号赋值:
{:5_106:}
页:
[1]