Python基础之赋值,浅拷贝,深拷贝的区别
一、赋值
不会开辟新的内存空间,只是复制了新对象的引用。所以当一个数据发生变化时,另外一个数据也会随之改变。
二、浅拷贝
创建新对象,其内容是对原对象的引用。浅拷贝之所以称为浅拷贝,是因为它仅仅只拷贝了第一层,即只拷贝了最外层的对象本身,内部的元素都只是拷贝了一个引用而已,即内部元素如果被修改,则另外一个数据也会发生变化。
浅拷贝的三种形式:
A = [1, 2, 3, 4]
- 切片操作
# 第1种
B = A[:]
# 第2种
B = [a for a in A]
- 工厂函数
B = list(A)
- copy函数
B = copy.copy(A)
浅拷贝要分两种情况进行讨论:
1)当浅拷贝的值是不可变对象(例如字符串、元组、数值类型)时,和赋值情况一样,对象的内存地址(id())与浅拷贝原来的值一致。
2)当浅拷贝的值是可变对象(例如列表、字典、集合等)时,也需要分两种情况讨论:
首先,原来值的内存地址与拷贝后的内存地址不同。
- 当要拷贝的对象里面,没有可变的子对象时,原来值(拷贝值)的改变并不会影响拷贝值(原来值)。
- 当要拷贝的对象里面,有可以改变的子对象时,改变该子对象,原来值和拷贝值之间会互相影响。
三、深拷贝
深拷贝拷贝出来的对象是一个全新的对象,和原来的对象没有任何的关联。改变原有对象不会影响新的拷贝对象。
四、例子
- 不可变对象
import copy
# 不可变对象
# A = (1, 2, 'hello') # 元组
# A = 1 # 数值
A = 'hello' # 字符串
print("********赋值********")
B = A
print(id(A))
print(id(B))
print(A)
print(B)
print("********浅拷贝********")
B = copy.copy(A)
print(id(A))
print(id(B))
print(A)
print(B)
print("********深拷贝********")
B = copy.deepcopy(A)
print(id(A))
print(id(B))
print(A)
print(B)
结果:
********赋值********
1894005658264
1894005658264
hello
hello
********浅拷贝********
1894005658264
1894005658264
hello
hello
********深拷贝********
1894005658264
1894005658264
hello
hello
- 可变对象
import copy
# 可变对象
A = [1, 2, 3]
print("********赋值********")
B = A
print(id(A))
print(id(B))
print(A)
print(B)
print("********浅拷贝********")
B = copy.copy(A)
print(id(A))
print(id(B))
print(A)
print(B)
print("********深拷贝********")
B = copy.deepcopy(A)
print(id(A))
print(id(B))
print(A)
print(B)
结果:
********赋值********
1602694308360
1602694308360
[1, 2, 3]
[1, 2, 3]
********浅拷贝********
1602694308360
1602694308424
[1, 2, 3]
[1, 2, 3]
********深拷贝********
1602694308360
1602950316296
[1, 2, 3]
[1, 2, 3]
- 可变对象修改外层
import copy
# 可变对象
A = [1, 2, 3, [11, 10, 20]]
# 可变对象的外层修改
B1 = A # 赋值
B2 = copy.copy(A) # 浅拷贝
B3 = copy.deepcopy(A) # 深拷贝
A.append(4)
print("********赋值********")
print(id(A))
print(id(B1))
print(A)
print(B1)
print("********浅拷贝********")
print(id(A))
print(id(B2))
print(A)
print(B2)
print("********深拷贝********")
print(id(A))
print(id(B3))
print(A)
print(B3)
结果:
********赋值********
2215309238856
2215309238856
[1, 2, 3, [11, 10, 20], 4]
[1, 2, 3, [11, 10, 20], 4]
********浅拷贝********
2215309238856
2215593496776
[1, 2, 3, [11, 10, 20], 4]
[1, 2, 3, [11, 10, 20]]
********深拷贝********
2215309238856
2215593518024
[1, 2, 3, [11, 10, 20], 4]
[1, 2, 3, [11, 10, 20]]
- 可变对象修改内层
import copy
# 可变对象
A = [1, 2, 3, [11, 10, 20]]
# 可变对象的内层修改
B1 = A # 赋值
B2 = copy.copy(A) # 浅拷贝
B3 = copy.deepcopy(A) # 深拷贝
A[3].append(4)
print("********赋值********")
print(id(A))
print(id(B1))
print(A)
print(B1)
print("********浅拷贝********")
print(id(A))
print(id(B2))
print(A)
print(B2)
print("********深拷贝********")
print(id(A))
print(id(B3))
print(A)
print(B3)
结果
********赋值********
2288591069768
2288591069768
[1, 2, 3, [11, 10, 20, 4]]
[1, 2, 3, [11, 10, 20, 4]]
********浅拷贝********
2288591069768
2288847138760
[1, 2, 3, [11, 10, 20, 4]]
[1, 2, 3, [11, 10, 20, 4]]
********深拷贝********
2288591069768
2288847168264
[1, 2, 3, [11, 10, 20, 4]]
[1, 2, 3, [11, 10, 20]]
到此这篇关于Python基础之赋值,浅拷贝,深拷贝的区别的文章就介绍到这了,更多相关Python赋值 浅拷贝 深拷贝的区别内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341