python赋值,深拷贝和浅拷贝的区别
2024-09-03 21:31:16
1.赋值
list1=[[1,2],'fei',66]
list2=list1
list1
[[1, 2], 'fei', 66]
list2
[[1, 2], 'fei', 66]
list2.append(77)
list2
[[1, 2], 'fei', 66, 77]
list1
[[1, 2], 'fei', 66, 77]
id(list1),id(list2)
(72624608, 72624608)
总结:list1赋值给list2,其实就是list2引用了list1.两个变量指向同一个对象,顾当list2增加一个元素时list1也会增加
2.浅拷贝
使用的方法:copy.copy()
代码示例:
>>> import copy
>>> list1=[[1,2],'fei',66]
>>> list2=copy.copy(list1)
>>> print(id(list1))
55713024
>>> print(id(list2))
55712864
>>> print(id(list1[0]),'\n',id(list2[0]))
55712184
55712184
>>> print(id(list1[1]),'\n',id(list2[1]))
61987040
61987040
>>> print(id(list1[2]),'\n',id(list2[2]))
2057136240
2057136240 #总结:list2浅拷贝list1,list1与list2的id不一样,但是列表里面每个单独的元素id是一样的 >>>list1=[[1,2],'fei',66]
>>> list2=copy.copy(list1)
>>> list1
[[1, 2], 'fei', 66]
>>> list2
[[1, 2], 'fei', 66]
>>> list1[0][0]=11
>>> list1
[[11, 2], 'fei', 66]
>>> list2
[[11, 2], 'fei', 66]
>>> list1[1]='change'
>>> list1
[[11, 2], 'change', 66]
>>> list2
[[11, 2], 'fei', 66] #总结:改变list1中第一个元素列表的值时,list2中第一个元素的值也相应改变,改变list1中第二个元素的值时,list2中第二个元素的值未改变(第一个元素列表是可变对象,第二个元素字符串是不可变对象)
最后总结:浅拷贝后,改变原始对象中可变类型的元素的值会同时影响拷贝对象,改变原始对象中不可变类型的元素的值,不会影响拷贝对象(只拷贝了父级,子级未拷贝)
3.深拷贝
使用的方法:copy.deepcopy()
代码示例:
>>> list1=[[1,2],'fei',66]
>>> list3=copy.deepcopy(list1)
>>> print(id(list1),'\n',id(list2))
62055888
55713624
>>> print(id(list1[0]),'\n',id(list2[0]))
55726368
55713704
>>> print(id(list1[1]),'\n',id(list2[1]))
61987040
61987040
>>> print(id(list1[2]),'\n',id(list2[2]))
2057136240
2057136240 #总结:list3深拷贝list1,list1与list3的id不一样,list1中可变对象的元素与list3中的id不一样,list1中不可变对象的元素与list3中的id一样 >>> list1[0][0]=11
>>> list1
[[11, 2], 'fei', 66]
>>> list3
[[1, 2], 'fei', 66]
>>> list1[1]='change'
>>> list1
[[11, 2], 'change', 66]
>>> list3
[[1, 2], 'fei', 66]
>>> id(list1[1])
62058944
>>> id(list3[1])
61987040 #总结:list3深拷贝list1,list1中的可变元素修改后,list3中的可变元素不会发生变化,list1中的不可变元素修改后,list3中的不可变元素亦不会发生变化
最后总结:深拷贝后,改变原始对象中可变类型的元素的值会不会影响拷贝对象,改变原始对象中不可变类型的元素的值,不会影响拷贝对象(父级与子级都会拷贝)
最新文章
- 如何给不支持新特性的浏览器打补丁(让老版本IE兼容新特性)
- 个人项目制作(PSP)
- Android开源框架:NineOldAndroid
- C# 对Access数据库操作的通用类
- brew gradle
- 源代码安装GIT
- 移动tempdb导致数据库服务不能启动
- Zabbix3.0部署最佳实践
- Linux系统/dev/mapper目录浅谈
- MySQL_时间戳处理
- CH0101 a^b、 CH0102 64位整数乘法(快速幂、快速乘)【模板题】
- Linux CentOS下Python+robot framework环境搭建
- Python3求栈最小元素
- win10 与linux mint双系统 只能进入mint而无法进入windows的解决方案
- Python的Scikit-learn如何选择合适的机器学习算法?
- .Net Identity OAuth 2.0 SecurityStamp 使用
- 利用GDAL从内存中直接解析图像数据
- 生成器-yield初接触
- 第八章(三)基于Listcheck适配器的访问控
- AndroidStudio简单的apk混淆
热门文章
- (1) arm 指令格式
- canvas绘制折线路径动画
- 第四部分 数据搜索之使用HBASE的API实现条件查询
- xml数据解析和生成
- phpstorm中加上符号($,括号等)后搜索不到
- vue中的nextTick
- github图文入门教程
- 一些代码小技巧&;经典代码
- 设置vue全局配置
- ARM64平台编译stream、netperf出错解决办法 解决办法:指定编译平台为alpha [root@localhost netperf-2.6.0]# ./configure –build=alpha