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赋值、深拷贝和浅拷贝的区别详解

一、前言

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

二、区别

1、直接赋值,默认浅拷贝传递对象的引用而已,原始列表改变,被赋值的变量也会做相同的改变

# 直接赋值
dict_1 = {"key1":[1,2,3,4],"key2":"val2"}
dict_2 = dict_1
dict_1["key1"].append(5)
print("dict_1内存地址:",id(dict_1),id(dict_1["key1"]),dict_1)
print("dict_2内存地址:",id(dict_2),id(dict_2["key1"]),dict_2)

? 2、浅拷贝,只拷贝父对象,子对象只是引用内存地址(不会拷贝嵌套的对象)

# 浅拷贝
dict_1 = {"key1":[1,2,3,4],"key2":"val2"}
dict_2 = dict_1.copy()
dict_1["key1"].append(5)
print("dict_1内存地址:",id(dict_1),id(dict_1["key1"]),dict_1)
print("dict_2内存地址:",id(dict_2),id(dict_2["key1"]),dict_2)

?备注:父对象的内存地址直接被拷贝到了一个新的电脑上,但是对于子对象只是引用了它的内存地址,并没有拷贝子对象里面可迭代的内容。如果子对象里面的内容修改后,被赋值的变量也会做相同的改变

3、深拷贝,父对象,子对象都会拷贝

# 深拷贝代码
dict_1 = {"key1":[1,2,3,4],"key2":"val2"}
# 浅拷贝
dict_2 = dict_1.copy()
# 深拷贝
dict_3 = copy.deepcopy(dict_1)
dict_1["key1"].append(5)
print("dict_1内存地址:",id(dict_1),id(dict_1["key1"]),dict_1)
print("dict_2内存地址:",id(dict_2),id(dict_2["key1"]),dict_2)
print("dict_3内存地址:",id(dict_3),id(dict_3["key1"]),dict_3)

?备注:深拷贝的话,就直接将父对象,子对象的内容拷贝到了自己的电脑上。通俗点讲,浅拷贝的话就是藕断丝连,深拷贝的话就是绝交。在使用上,不得不去拷贝对象的时候,尽量使用深拷贝,因为浅拷贝的话,是引用子对象的内存地址。深拷贝的话主要就是用在了有嵌套对象。

接下来的话一张图进行展示:

4、面试题:不可变元组和可变列表深浅拷贝的区别

a_tuple = (1,2)
b = copy.copy(a_tuple)
c = copy.deepcopy(a_tuple)
print(b == c)
print(id(b) == id(c))
print(id(a_tuple))
print(id(b))
print(id(c))

a_list = [3,4]
b = copy.copy(a_list)
c = copy.deepcopy(a_list)
print(b == c)
print(id(b) == id(c))
print(id(a_tuple))
print(id(b))
print(id(c))

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

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