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,[& ...
随机推荐
- Shiro入门 - 通过自定义Realm连数数据库进行认证
添加shiro-realm.ini文件 [main] #自定义Realm myRealm=test.shiro.MyRealm #将myRealm设置到securityManager,相当于Sprin ...
- Django学习手册 - Form 插件
""" 核心: from django import formsfrom django.forms import fieldsfrom django.forms impo ...
- Redis随笔
dump.rdb:快照文件 删除这个文件 rm -f dump.rdb 第一步:创建6个redis实例,端口号从7001~7006 第二步:修改redis的配置文件 1.修改端口号 修改redis.c ...
- mysql数据库卸载和安装
背景: 由于之前一个项目中用的数据库版本是免安装的mysql5.5.36,但是后来经过第三方测试公司测试出该数据库存在很多漏洞需要升级数据库才能解决.所以觉得将数据库更换为mysql-5.7.21-w ...
- vue组件监听不生效,比深度监听还管用哦
在Watch监听数组里面里加上 immediate: true, watch:{ myArrList:{ immediate: true, handler(curVal,oldVal){ consol ...
- CF1139A Even Substrings
题目地址:CF1139A Even Substrings 一个数是偶数等价于其最后一位为偶数(2/4/6/8/0) 从左往右扫一遍,如果一个数是奇数则直接跳过,偶数则加上它对答案的贡献 这里的贡献应该 ...
- SpringSocial简介
⒈常用的pom依赖 <dependency> <groupId>org.springframework.social</groupId> <artifactI ...
- 基于ATT和CK™框架的开放式方法评估网络安全产品
场景 提供有关如何使用特定商业安全产品来检测已知对手行为的客观见解 提供有关安全产品和服务真实功能的透明度以检测已知的对手行为 推动安全供应商社区增强其检测已知对手行为的能力 地址 https://a ...
- 002_运维SOP
一. <1>SOP:运维工作的标准化 <2>回滚:代码回滚 <3>降级:是利用有限资源,保障系统核心功能高可用.有损的架构方法 <4>多活切换:多机房切 ...
- ansible笔记(3):ansible模块的基本使用
ansible笔记():ansible模块的基本使用 在前文的基础上,我们已经知道,当我们使用ansible完成实际任务时,需要依靠ansible的各个模块,比如,我们想要去ping某主机,则需要使用 ...