IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Python深拷贝与浅拷贝 -> 正文阅读

[Python知识库]Python深拷贝与浅拷贝

一、is与==的区别

  • is 是比较两个引用是否指向了同一个对象(引用比较)
  • == 是比较两个对象的值是否相等(值比较)
    例:
a = [11, 22, 33]
b = [11, 22, 33]
c = a

print(id(a))
print(id(b))
print(id(c))

print(a == b)
print(a is b)
print(a is c)

二、深拷贝、浅拷贝

1.浅拷贝

只拷贝最顶层

a = [11, 22, 33]
b = a
# a指向一个列表,当执行 b=a时,b也指向了a指向的那个列表
# 把这种通过赋值运算符来完成的这种赋值,可以叫做 引用的复制,也可以把这种复制称之为浅拷贝
import copy

a = [11, 22, 33]
b = copy.copy(a)
# a、b指向的不是同一个列表,因为下面打印出来的两个地址不同
print(id(a))
print(id(b))
import copy

a = [11, 22]
b = [33, 44]
c = [a, b]

d = copy.copy(c)

print(id(c))	# 140610028426496
print(id(d))	# 140610028426752

a.append(55)
print(c)	# [[11, 22, 55], [33, 44]]
print(d)	# [[11, 22, 55], [33, 44]]

2.深拷贝

递归拷贝所有的数据

import copy

a = [11, 22]
b = [33, 44]
c = [a, b]

d = copy.deepcopy(c)

print(id(c))	# 140610028426496
print(id(d))	# 140610028426752

a.append(55)
print(c)	# [[11, 22, 55], [33, 44]]
print(d)	# [[11, 22], [33, 44]]

三、拷贝的其他方式

a = [11, 22]
b = [33, 44]
c = [a, b]

d = c[:]	# 当使用列表切片的时候就是浅拷贝,与d = copy.copy(c)一样

print(id(c))	# 地址不同,值相同
print(id(d))

a.append(55)
print(c)
print(d)

字典的copy方法:

b = dict(name='xx', age=18, cars=[100, 200, 300])
c = b.copy()	# 浅拷贝

print(b)
print(c)
print(id(b))    # 地址不同
print(id(c))

b['cars'].append(10)
print(b)    # 值相同
print(c)

四、深拷贝与浅拷贝的总结

1. 浅拷贝对不可变类型和可变类型的copy不同

  • copy.copy 对于可变类型,会进行浅拷贝
  • copy.copy 对于不可变类型,不会拷贝,仅仅是指向
import copy

a = [11, 22, 33]
b = (11, 22, 33)

c = copy.copy(a)    # 当使用copy.copy来完成浅拷贝时,它会检测拷贝的数据类型是否可变,如果是则拷贝顶层,否则拷贝引用
d = copy.copy(b)    # 相当于 d = b

print(id(a), id(c))     # 地址不同
print(id(b), id(d))     # 地址同

2. copy.copy 与 copy.deepcopy 的区别

浅拷贝:

a = [11, 22]
b = (a,)
c = [b]

d = copy.copy(c)
# copy.copy拷贝一个元组时是引用复制;而copy一个列表,这个列表中嵌套元组时,它依然是浅拷贝
# 即,当copy.copy遇到一个嵌套的数据类型时,仅仅检测最顶层的数据类型,而内部嵌套的数据类型不会检测
print(id(c), id(d))     # 地址不同

深拷贝:

a = [11, 22]
b = (a,)
c = [b]

d = copy.deepcopy(c)

print(id(c), id(d))     # 地址不同
a.append(33)
print(c)	# [([11, 22, 33],)]
print(d)	# [([11, 22],)]

五、总结

1.如果是仅仅使用赋值运算符,那么一定是引用复制
2.如果是使用copy.copy,则要分2种:如果最顶层是不可变类型,那么就是复制引用;如果顶层是可变类型,那么就是浅拷贝,即只拷贝最顶层的
3.如果使用的是copy.deepcopy,那么一定是递归拷贝,即全部复制

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-09-24 20:53:29  更:2022-09-24 20:56:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 0:51:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码