详解Python列表赋值复制深拷贝及5种浅拷贝
作者:IT白鸽 发布时间:2022-07-16 16:22:41
概述
在列表复制这个问题,看似简单的复制却有着许多的学问,尤其是对新手来说,理所当然的事情却并不如意,比如列表的赋值、复制、浅拷贝、深拷贝等绕口的名词到底有什么区别和作用呢?
列表赋值
# 定义一个新列表
l1 = [1, 2, 3, 4, 5]
# 对l2赋值
l2 = l1
print(l1)
l2[0] = 100
print(l1)
示例结果:
[1, 2, 3, 4, 5]
[100, 2, 3, 4, 5]
可以看到,更改赋值后的L2后L1同样也会被更改,看似简单的“复制”,在Python中,列表属于可变对象,而对可变对象的复制其实就是将列表的内存空间类似C中的指针再次指向新的变量名,而不是诸如字符串这种不可变对象在复制时会创建新的内存空间进行赋值。即此时L1和L2指向的是同一片内存空间,那么怎么实现真正复制呢?
浅拷贝
当列表中的元素为不可变对象时,我们可以用以下方法对列表进行赋值:
import copy
# 定义一个新列表
L0 = [1, 2, 3, 4, 5]
print(L0)
print('-'*40)
利用切片
L1 = L0[:]
L1[0] = 100
print(L0)
利用模块copy
import copy
L2 = copy.copy(L0)
L2[0] = 100
print(L0)
利用list()
L3 = list(L0)
L3[0] = 100
print(L0)
利用列表方法extend
L4 = []
L4.extend(L0)
L4[0] = 100
print(L0)
利用列表推导
L5 = [i for i in L0]
L5[0] = 100
print(L0)
可以看到最终的打印结果都是[1, 2, 3, 4, 5],我们成功进行了列表的复制,但是为了条件需要是列表中元素为不可变对象呢? 因为如果列表中的元素为可变对象,在复制时有会发生对象的引用,而不是新建内存空间进行引用,比如:
L0 = [1, 2, [3], 4, 5]
print(L0)
L2 = L0[:]
L2[2][0] = 100
print(L0)
示例结果:
[1, 2, [3], 4, 5]
[1, 2, [100], 4, 5]
可以看到,当列表L0中含有可变对象时,对复制后的L1进行改变其中可变对象元素L2[2]时,L0中的可变对象L0[2]也发生了改变,那么怎么实现真正的完全的拷贝呢?
深拷贝
利用copy模块中的deepcopy进行深拷贝:
import copy
L0 = [1, 2, [3], 4, 5]
print(L0)
L2 = copy.deepcopy(L0)
L2[2][0] = 100
print(L2)
print(L0)
示例结果:
[1, 2, [100], 4, 5]
[1, 2, [3], 4, 5]
总结
以上所述是小编给大家介绍的详解Python列表赋值复制深拷贝及5种浅拷贝,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!
来源:https://www.jianshu.com/p/049bbf2072a7
猜你喜欢
- 背景介绍Expect 程序主要用于人机对话的模拟,就是那种系统提问,人来回答 yes/no ,或者账号登录输入用户名和密码等等的情况。因为这
- Oracle是目前应用最广泛的数据库系统。一个完整的数据库系统包括系统硬件、操作系统、网络层、DBMS(数据库管理系统)、应用程序与数据,各
- 实际参数在函数中我们可以使用 arguments 对象获得 (注:形参可通过 arguments.callee 获得),虽然 argumen
- 宝塔更新Python版本因为在宝塔中的Python版本为2.6.8,使用宝塔Python项目管理的话需要把Python升级到3.x,不然的话
- 在web开发中经常遇到多关键词对对个字段查询,我一般是通过动态数组来实现的。当然多个关键词的一般是用空格或,隔开,我这几假设多个
- 本文实例为大家分享了用KNN算法手写体识别的具体代码,供大家参考,具体内容如下#!/usr/bin/python #coding:utf-8
- 方法如下: response.cookies(cookiesname)[(key)|.attribute]=value 解释如下:cooki
- argparse 是python自带的命令行参数解析包,可以用来方便地读取命令行参数。一、传入一个参数import argpars
- URL 编码是什么东东呢?看看我从网上抄的定义: 引用: url编码是一种浏览器用来打包
- 使用thinkphp官方的WeChat包,使用不同模式可以成功,但是安全模式就是不行,现将分析解决结果做下记录。分析问题: &nb
- 方法来源于土豆网的导航,在这里纪录一下实现的思路。主要是利用 position 属性的 absolute 和 relative 配
- 图片的间隙Q:我有一张大图片,把它切割后在Dreamweaver中进行拼接,可是总是有间隙,不知为什么?A:不知你是否把表格的边距、间距和边
- 本文介绍了python selenium UI自动化解决验证码的4种方法,分享给大家,具体如下:测试环境windows7+firefox50
- 异常异常是程序发生错误的信号,程序一旦出错就会抛出异常,程序的运行随之终止。# 异常处理的三个特征- 异常的追踪信息- 异常的类型- 异常的
- 现在jquery应用的越来越多, 有些同学在享受爽快淋漓coding时就将性能问题忽略了, 比如我. jquery虽
- opencv-python打开USB或笔记本前置摄像头代码其中video_index是摄像头编号,一般前置摄像头为0,USB摄像头为1或2.
- 记录了Windows安装python3.7的详细过程,供大家参考,具体内容如下1. 在python的官网下载python对应版本:官网地址6
- 数组:复制传递(不要按照c/c++的方式去理解,c/c++中数组是引用传递),定长切片:引用传递,底层实现是3个字段 array(数组) +
- 模式库 在模式库里,我将列出所有电子商务网站需要的模式.以下将罗列出经典常用的模式案例,我也试图让这些模式看起来更有趣味性与实用性。(Yah
- 写ASP程序时,一般情况总是使用的VBScript,不过也不只是这一种选择,也可以用JScript。但在用JScript作为ASP的语言时,