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的浅拷贝和深拷贝


面试的时候被问到“知道浅拷贝和深拷贝吗?”
“…” “os:什么…没听过…”
于是,今天来扒一扒这个知识点。

前提

浅拷贝和深拷贝,其实就是数据拷贝。
- 当拷贝的是不可变数据类型(数值、字符串、元组),不管是深拷贝和浅拷贝,都指向的是同一地址;

import copy
a = 1
b = copy.copy(a)
c = copy.deepcopy(a)
print(a, id(a))
print(b, id(b))
print(c, id(c))

运行结果:

1 4362989344
1 4362989344
1 4362989344

- 当拷贝的对象是可变数据类型(列表、字典),浅拷贝深拷贝才生效。

普通的变量赋值

我们平常使用的变量赋值,就是浅拷贝。即两个变量共享同一个内存块,相同的内存地址,一旦值发生改变,另外一个变量的值也会跟随着一起变化。

# 变量赋值
li = ['123', 5, 'abc', 9]
a = li
print(id(li))
print(id(a))

# 修改a的数据
a[1] = ['333']
print(id(li), li)
print(id(a), a)

运行结果:

4351771104
4351771104
4330881504 ['123', ['333'], 'abc', 9]
4330881504 ['123', ['333'], 'abc', 9]

常规的变量赋值共享一个代码块,内存地址相同,值发生改变时同一个内存地址的值都会跟着改变。

浅拷贝和深拷贝

copy.copy() – 浅拷贝,重新分配内存,只拷贝父对象,不会拷贝对象的内部的子对象;
copy.deepcopy() – 深拷贝,重新分配内存,拷贝对象及其所有子对象;

浅拷贝和深拷贝的区别

  • 当拷贝的对象无复杂子对象时:
    对于常规的字典或者列表使用copy模块的深拷贝或者浅拷贝,两者并没有区别。
import copy
print('使用浅拷贝:')
a = ['A', 'B', 'C', 'D']
# 使用浅拷贝
b = copy.copy(a)
b[1] = 42
print(id(a), a)
print(id(b), b)
print('****************************')

print('使用深拷贝:')
a = ['A', 'B', 'C', 'D']
# 使用深拷贝
b = copy.deepcopy(a)
b[1] = 42
print(id(a), a)
print(id(b), b)

运行结果:

使用浅拷贝:
4386645008 ['A', 'B', 'C', 'D']
4386646288 ['A', 42, 'C', 'D']
****************************
使用深拷贝:
4386645728 ['A', 'B', 'C', 'D']
4386645008 ['A', 42, 'C', 'D']
  • 当字典或者列表中还有包含有子对象时:
    使用copy模块的深拷贝和浅拷贝的话,结果就大不相同了。
import copy
print('使用浅拷贝:')
a = ['A', 'B', ['C', 'D', 'E'], 'F']
# 使用浅拷贝
b = copy.copy(a)
b[2][1] = 42
print(id(a), a)
print(id(b), b)
print('********************************************')

print('使用深拷贝:')
a = ['A', 'B', ['C', 'D', 'E'], 'F']
# 使用深拷贝
b = copy.deepcopy(a)
b[2][1] = 42
print(id(a), a)
print(id(b), b)

运行结果:

使用浅拷贝:
4461652240 ['A', 'B', ['C', 42, 'E'], 'F']
4461651680 ['A', 'B', ['C', 42, 'E'], 'F']
*********************************************
使用深拷贝:
4461652000 ['A', 'B', ['C', 'D', 'E'], 'F']
4461652240 ['A', 'B', ['C', 42, 'E'], 'F']

由此可见:

如果列表或者字典没有包含子列表或者子字典的话,使用深拷贝或者浅拷贝效果都有一样;

如果列表或者字典中存在子类的时候,只有深拷贝才会为所有的子类也重新分配内存,而浅拷贝只负责父对象,不考虑子对象。

(原贴:https://cloud.tencent.com/developer/article/1597913)

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-10-16 19:36:13  更:2021-10-16 19:38:43 
 
开发: 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/15 20:59:39-

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