Python列表赋值,复制,深拷贝以及5种浅拷贝详解

  • 时间:2019-06-11 04:35 作者:急速奔跑中的蜗牛 来源:急速奔跑中的蜗牛 阅读:675
  • 扫一扫,手机访问
摘要:概述在列表复制这个问题,看似简单的复制却有着许多的学识,尤其是对新手来说,天经地义的事情却并不如意,比方列表的赋值、复制、浅拷贝、深拷贝等绕口的名词究竟有什么区别和作用呢?列表赋值# 定义一个新列表l1 = [1, 2, 3, 4, 5]# 对l2赋值l2 = l1print(l1)l2[0] =

概述

在列表复制这个问题,看似简单的复制却有着许多的学识,尤其是对新手来说,天经地义的事情却并不如意,比方列表的赋值、复制、浅拷贝、深拷贝等绕口的名词究竟有什么区别和作用呢?

列表赋值

# 定义一个新列表l1 = [1, 2, 3, 4, 5]# 对l2赋值l2 = l1print(l1)l2[0] = 100print(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] = 100print(L0)

利用板块copy

import copyL2 = copy.copy(L0)L2[0] = 100print(L0)

利用list()

L3 = list(L0)L3[0] = 100print(L0)

利用列表方法extend

L4 = []L4.extend(L0)L4[0] = 100print(L0)

利用列表推导

L5 = [i for i in L0]L5[0] = 100print(L0)

可以看到最终的打印结果都是[1, 2, 3, 4, 5],我们成功进行了列表的复制,但是为了条件需要是列表中元素为不可变对象呢? 由于假如列表中的元素为可变对象,在复制时有会发生对象的引用,而不是新建内存空间进行引用,比方:

L0 = [1, 2, [3], 4, 5]print(L0)L2 = L0[:]L2[2][0] = 100print(L0)

示例结果:

[1, 2, [3], 4, 5][1, 2, [100], 4, 5]

可以看到,当列表L0中含有可变对象时,对复制后的L1进行改变其中可变对象元素L2[2]时,L0中的可变对象L0[2]也发生了改变,那么怎样实现真正的完全的拷贝呢?

深拷贝

利用copy板块中的deepcopy进行深拷贝:

import copyL0 = [1, 2, [3], 4, 5]print(L0)L2 = copy.deepcopy(L0)L2[2][0] = 100print(L2)print(L0)

示例结果:

[1, 2, [100], 4, 5][1, 2, [3], 4, 5]

Python直播学习群:556370268,这里有资源共享,技术解答,还有小编从最基础的Python资料到项目实战的学习资料都有整理,希望能帮助你更好的学习python。

  • 全部评论(0)
最新发布的资讯信息
【系统环境|】2025含金量排名前十计算机专业证书(2025-10-15 20:51)
【系统环境|】你有白帽众测 我有黑帽雇佣(2025-10-15 20:50)
【系统环境|】印度理工学院成功开发出针对5G网络攻击的最新软件解决方案(2025-10-15 20:49)
【系统环境|】道德黑客与黑客教程(2025-10-15 20:49)
【系统环境|】苹果翻车!macOS 15 竟藏“后门”,黑客能直接偷你所有密码(2025-10-15 20:47)
【系统环境|】解密“被墙”玄学:为什么我的网络方案能做到长期稳定?(2025-10-15 20:46)
【系统环境|】NAS软路由/防火墙/网络安全需要注意哪些?如何保护你的网络设备(2025-10-15 20:45)
【系统环境|】你真的理解防火墙吗?(2025-10-15 20:44)
【系统环境|】苹果手机一键换机教程详解(2025-10-15 20:44)
【系统环境|】二手iPhone到手后怎么快速验机?(2025-10-15 20:43)
手机二维码手机访问领取大礼包
返回顶部