Python中什么是深拷贝和浅拷贝且有什么区别
浅拷贝:
>>> a = [1, 2, 3]
>>> b = a
>>> a
[1, 2, 3]
>>> b
[1, 2, 3]
>>> id(a)
2154993843464
>>> id(b)
2154993843464
浅拷贝把a 赋值给了b,并不是直接再给b来了一个列表而是a和b都指向了同一个地址。
深拷贝:
使用copy模块下的deepcopy()来完成深拷贝
>>> import copy
>>> a = [1, 2, 3]
>>> b = copy.deepcopy(a)
>>> a
[1, 2, 3]
>>> b
[1, 2, 3]
>>> id(a)
2154997247496
>>> id(b)
2154997247688
深拷贝浅拷贝的区别
浅拷贝:
a = [1, 2, 3]
b = a
print(f"{a}")
print(f"{b}")
a.append(888)
print("添加后的数据:")
print(f"{a}")
print(f"{b}")
执行结果:
[1, 2, 3]
[1, 2, 3]
添加后的数据:
[1, 2, 3, 888]
[1, 2, 3, 888]
深拷贝:
import copy
a = [1, 2, 3]
b = copy.deepcopy(a)
print(f"{a}")
print(f"{b}")
a.append(888)
print("添加后的数据:")
print(f"{a}")
print(f"{b}")
执行结果:
[1, 2, 3]
[1, 2, 3]
添加后的数据:
[1, 2, 3, 888]
[1, 2, 3] # <------区别在此
从上面的代码可以看出浅拷贝变更被拷贝对象的内容,拷贝方也会随之更改,而深拷贝则不受影响。
多层拷贝
import copy
a = [1, 2, 3]
b = [1, 2, 3]
c = [a, b]
# 浅拷贝
d = c
print("--------华丽的分割线--------")
print(f"c -> {id(c)}")
print(f"d -> {id(d)}")
print("--------华丽的分割线--------")
# 深拷贝
e = copy.deepcopy(c) # deep 深
print(f"c -> {id(c)}")
print(f"e -> {id(e)}")
print("--------华丽的分割线--------")
# 现在这个e到底是拷贝的c还是a和b呢
# 开始验证
c[0].append("我是新来的")
print(c[0])
print(e[0])
执行结果:
--------华丽的分割线--------
c -> 2133324736584
d -> 2133324736584
--------华丽的分割线--------
c -> 2133324736584
e -> 2133324736520
--------华丽的分割线--------
[1, 2, 3, '我是新来的']
[1, 2, 3] # 未变动证明直接对a 和 b进行了一份深拷贝,而不是对c进行了一份拷贝
注意: 多层拷贝时使用copy.deepcopy()会直接跟着引用走,拷贝最终指向【如果使用的是e = copy.copy©就只会拷贝括号中的对象©,不会拷贝到上一层不会拷贝最终指向】,如果拷贝的是不可变数据类型(如:元组)将不能进行深拷贝
总结:
当需要数据共享时使用浅拷贝,数据独立不进行共享时使用深拷贝
Python中什么是深拷贝和浅拷贝且有什么区别的更多相关文章
- Python中复制、深拷贝和浅拷贝的区别
深拷贝定义(deepcopy) 在Python中,由于一切皆对象,所以任何变量都可以被引用,也即可以被赋值给任何变量.但是在Python中,给变量赋值,是区分的,一般情况下,Python中的变量赋值都 ...
- python 中list的深拷贝和浅拷贝
注意:这里提到是list的隐式转换例如 a=[1,2,3]def test(n):n[2] = n[2]*2c=a此时是浅拷贝,当调用test(c)时,可以看到a也发生了变化c=[1,4,3]a=[1 ...
- python中赋值,深拷贝,浅拷贝区别
这三种 的区别就是 复制的变量 是否是原变量的引用. 赋值:只是原变量的引用. 浅拷贝和深拷贝的区别 需要通过 子元素 区分 浅拷贝:子元素的 引用相同 深拷贝:所以引用都不相同,完全复制一份 这三种 ...
- Python中内置数据类型list,tuple,dict,set的区别和用法
Python中内置数据类型list,tuple,dict,set的区别和用法 Python语言简洁明了,可以用较少的代码实现同样的功能.这其中Python的四个内置数据类型功不可没,他们即是list, ...
- Python中列表,元组,字典,集合的区别
参考文档https://blog.csdn.net/Yeoman92/article/details/56289287 理解Python中列表,元组,字典,集合的区别 列表,元组,字典,集合的区别是p ...
- Python中变量、赋值、浅拷贝、深拷贝
https://www.cnblogs.com/LetMe/p/6724555.html 在理解浅拷贝和深拷贝之前,首先要理解学习一下变量在Python中是怎样存储的: 变量的类型是分值引用与地址引用 ...
- python的复制,深拷贝和浅拷贝的区别
在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用 一般有三种方法, alist=[1,2,3,[& ...
- python的赋值,深拷贝和浅拷贝的区别
原文地址https://www.cnblogs.com/xueli/p/4952063.html 赋值:a = [1,2,3,["a","b"]] b=a,那 ...
- python的复制,深拷贝和浅拷贝的区别(转)
在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用 一般有三种方法, alist=[1,2,3,[& ...
随机推荐
- Angular4
1.安装node.js 官网下载安装 npm会跟着被自动安装 2.安装Angular工具(AngularCli) 1.使用npm安装 npm install -g @angular/cli 2使用cn ...
- SQL操作json类型数据的函数
MySQL5.7之后对json数据格式进行了函数支持 Json_contains(字段名, '值') 1.表中json格式的某个字段 2.json里的某个键值 Json_search(字段名, 'on ...
- 二、Java神经网络框架Neuroph的使用和架构分析
一.使用Neuroph Studio构造感知机处理逻辑与 新建项目 接着,输入名字和地址,点击“完成” 在工程的神经网络文件下新建神经网络 准备训练数据 开始训练 误差展示 也可以测试神经元 或者输入 ...
- 当linux中的所有指令突然不能使用的时候
接到同事电话,线上linux系统所有命令执行不了(由于其误操作执行一些命令) 此时可以按以下步骤解决问题: 1.首先导入临时变量(重启虚拟机之后失效),使得所有命令行暂时可以用 直接在命令行执行以下命 ...
- ES--03
第二十一讲! 1.上机动手实战演练基于_version进行乐观锁并发控制 (1)先构造一条数据出来 PUT /test_index/test_type/7{ "test_field" ...
- 最新sublime text 3 注册码license分享(亲测有效)
—– BEGIN LICENSE —– TwitterInc 200 User License EA7E-890007 1D77F72E 390CDD93 4DCBA022 FAF60790 61AA ...
- apache配置文件语法错误命令:httpd -t
cmd命令行切换到C:\wamp\bin\apache\apache2.4.9\bin目录 输入httpd -t命令 错误如下: 1.Syntax error on line 92 of C:/Apa ...
- 使用Gitblit 在Windows上部署Git Server
Windows平台下Git服务器搭建 首先要下载Java JDK,安装完成后设置环境变量,先把java环境配好,接下来才是下面的gitblit.关于java环境配置请看上一篇文章 gitblit下载 ...
- bootstrap 3列表单布局
<form class="form-horizontal" role="form"> <fieldset> <legend> ...
- Metrics介绍和Spring的集成
参考: http://colobu.com/2014/08/08/Metrics-and-Spring-Integration/ https://www.cnblogs.com/yangecnu/p/ ...