023Python深浅拷贝

时间:2019-11-03
本文章向大家介绍023Python深浅拷贝,主要包括023Python深浅拷贝使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

Python深浅拷贝


一、引言

在python中,对象赋值其实是对象的引用。当创建一个对象,然后把它赋值给另一个变量的时候,python并没有拷贝这个对象,而只是开杯乐这个对象的引用

针对该列表l1=['a','b','c',['d','e','f']]一般有三种方法,分别为:拷贝(赋值)、浅拷贝、深拷贝

注意:拷贝/浅拷贝/深拷贝都是针对可变类型数据而言的

1.1、 可变or不可变

可变数据类型:value值改变,id值不变;不可变数据类型:value值改变,id值也随之改变。

age = 19
print(f'first:{id(age)}')
age = 20
print(f'second:{id(age)}')
###输出结果:不可变数据类型
first:4384901776
second:4384901808

二、拷贝

如果l2是l1的拷贝对象,则l1内部的任何数据类型的元素变化,则l2内部的元素也会跟着改变,因为可变类型值变id不变。

l1 = ['a', 'b', 'c', ['d', 'e', 'f']]
l2 = l1

l1.append('g')

print(l1)
###输出结果
['a', 'b', 'c', ['d', 'e', 'f'], 'g']
print(l2)
###输出结果
['a', 'b', 'c', ['d', 'e', 'f'], 'g']


b = a: 赋值引用,a 和 b 都指向同一个对象。

三、浅拷贝

如果l2是l1的浅拷贝对象,则l1内的不可变元素发生了改变,l2不变;如果l1内的可变元素发生了改变,则l2会跟着改变。

import copy

l1 = ['a', 'b', 'c', ['d', 'e', 'f']]
l2 = copy.copy(l1)

l1.append('g')

print(l1)
###输出结果:
['a', 'b', 'c', ['d', 'e', 'f'], 'g']
###################
print(l2)
####输出结果
['a', 'b', 'c', ['d', 'e', 'f']]
##################
l1[3].append('g')

print(l1)
###输出结果:
['a', 'b', 'c', ['d', 'e', 'f', 'g'], 'g']
############
print(l2)
####输出结果:
['a', 'b', 'c', ['d', 'e', 'f', 'g']]

b = a.copy():浅拷贝, a 和 b 是一个独立的对象,但他们的子对象还是指向统一对象(是引用)。

四、深拷贝

如果l2是l1的深拷贝对象,则l1内的不可变元素发生了改变,l2不变;如果l1内的可变元素发生了改变,l2也不会变,即l2永远不会因为l1的变化而变化。

import copy

l1 = ['a', 'b', 'c', ['d', 'e', 'f']]
l2 = copy.deepcopy(l1)

l1.append('g')

print(l1)
###输出结果:
['a', 'b', 'c', ['d', 'e', 'f'], 'g']
print(l2)
###输出结果:
['a', 'b', 'c', ['d', 'e', 'f']]
l1[3].append('g')

print(l1)
###输出结果:
['a', 'b', 'c', ['d', 'e', 'f', 'g'], 'g']
print(l2)
###输出结果:
['a', 'b', 'c', ['d', 'e', 'f']]

b = copy.deepcopy(a): 深度拷贝, a 和 b 完全拷贝了父对象及其子对象,两者是完全独立的。

原文地址:https://www.cnblogs.com/FirstReed/p/11785684.html