Python浅拷贝有几种形式,与深拷贝不同在�

Admin 2022-06-13 群英技术资�

这篇文章主要介绍了Python浅拷贝有几种形式,与深拷贝不同在哪相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇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浅拷�

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:[email protected]进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容�

猜你喜欢

成为群英会员,开启智能安全云计算之旅

立即注册
专业资深工程师驻�
7X24小时快速响�
一站式无忧技术支�
免费备案服务
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 � 0668-2555555
在线客服
微信公众号
返回顶部
返回顶部 返回顶部