博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python深浅拷贝
阅读量:5360 次
发布时间:2019-06-15

本文共 1348 字,大约阅读时间需要 4 分钟。

目录

一、引言

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

针对该列表l1=['a','b','c',['d','e','f']]一般有三种方法,分别为:拷贝(赋值)、浅拷贝、深拷贝

注意:拷贝/浅拷贝/深拷贝都是针对可变类型数据而言的

1.1、可变or不可变

id不变值可变,即在原值的基础上修改,则为可变数据类型;值变id也变,即重新申请一个空间放入新值,则为不可变数据类型。

age = 19print(f'first:{id(age)}')age = 20print(f'second:{id(age)}')
first:4384901776second:4384901808

二、拷贝

如果l2是l1的拷贝对象,则l1内部的任何数据类型的元素变化,则l2内部的元素也会跟着改变,因为可变类型值变id不变。

l1 = ['a', 'b', 'c', ['d', 'e', 'f']]l2 = l1l1.append('g')print(l1)
['a', 'b', 'c', ['d', 'e', 'f'], 'g']
print(l2)
['a', 'b', 'c', ['d', 'e', 'f'], 'g']

三、浅拷贝

如果l2是l1的浅拷贝对象,则l1内的不可变元素发生了改变,l2不变;如果l1内的可变元素发生了改变,则l2会跟着改变。

import copyl1 = ['a', 'b', 'c', ['d', 'e', 'f']]l2 = copy.copy(l1)l1.append('g')print(l1)
['a', 'b', 'c', ['d', 'e', 'f'], 'g']
print(l2)
['a', 'b', 'c', ['d', 'e', 'f']]
l1[3].append('g')print(l1)
['a', 'b', 'c', ['d', 'e', 'f', 'g'], 'g']
print(l2)
['a', 'b', 'c', ['d', 'e', 'f', 'g']]

四、深拷贝

如果l2是l1的深拷贝对象,则l1内的不可变元素发生了改变,l2不变;如果l1内的可变元素发生了改变,l2也不会变,即l2永远不会因为l1的变化而变化。

import copyl1 = ['a', 'b', 'c', ['d', 'e', 'f']]l2 = copy.deepcopy(l1)l1.append('g')print(l1)
['a', 'b', 'c', ['d', 'e', 'f'], 'g']
print(l2)
['a', 'b', 'c', ['d', 'e', 'f']]
l1[3].append('g')print(l1)
['a', 'b', 'c', ['d', 'e', 'f', 'g'], 'g']
print(l2)
['a', 'b', 'c', ['d', 'e', 'f']]

转载于:https://www.cnblogs.com/nickchen121/p/11069994.html

你可能感兴趣的文章
关于maven中一些问题的解决尝试
查看>>
Cisco配置DHCP中继代理工程实例
查看>>
Linux命令之sftp - 安全文件传输命令行工具
查看>>
MySQL Workbench 修改快捷键
查看>>
算法笔记_228:信用卡号校验(Java)
查看>>
ffmpeg部署
查看>>
python遍历文件夹
查看>>
mysql简介以及常用dos命令
查看>>
vmware下的linux的host only上网配置
查看>>
hibernate+mysql关联映射师遇到java.lang.StackOverflowError异常
查看>>
JavaScript中正则编码
查看>>
矩阵基础知识(五)
查看>>
php7 & lua 压测对比
查看>>
dojo定义widget
查看>>
修改OpenLayer的图片路径
查看>>
CSS垂直居中
查看>>
[转载]AngularJS入门教程02:AngularJS模板
查看>>
linux第5天 socket api
查看>>
linux程序分类
查看>>
(九)UIScrollView和PageControl的分页
查看>>