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

yipeiwu_com6年前Python基础

概述

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

列表赋值

# 定义一个新列表
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种浅拷贝,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

相关文章

对PyQt5中的菜单栏和工具栏实例详解

对PyQt5中的菜单栏和工具栏实例详解

在这一部分,我们学习创建状态栏,菜单栏和工具栏。一个菜单是位于菜单栏的一组命令。一个工具栏有一些按钮,这些按钮在应用程序中拥有一些常用命令。状态栏显示状态信息,通常位于应用窗口下方。 Q...

Ubuntu16.04/树莓派Python3+opencv配置教程(分享)

无论是Windows、Linux、还是树莓派 。配置python3的opencv环境都是让人头大的一件事情,尤其是许多人用pip安装以后,发现opencv虽然装上了,但是却装在了系统原生...

100行Python代码实现每天不同时间段定时给女友发消息

100行Python代码实现每天不同时间段定时给女友发消息

每天不同时间段通过微信发消息提醒女友 简介 有时候,你很想关心她,但是你太忙了,以至于她一直抱怨,觉得你不够关心她。你暗自下决心,下次一定要准时发消息给她,哪怕是几句话,可是你又忘记了。...

推荐10款最受Python开发者欢迎的Python IDE

推荐10款最受Python开发者欢迎的Python IDE

Python 非常易学,强大的编程语言。Python 包括高效高级的数据结构,提供简单且高效的面向对象编程。 Python 的学习过程少不了 IDE 或者代码编辑器,或者集成的开发编辑器...

Python输出\u编码将其转换成中文的实例

Python输出\u编码将其转换成中文的实例

爬取了下小猪短租的网站出租房信息但是输出的时候是这种: 百度了下。python2.7在window上的编码确实是个坑 解决如下 如果是个字典的话要先将其转成字符串 导入json库 然后...