Python学习教程:Python列表赋值,复制,深拷贝及5种浅拷贝详解

Python学习教程:Python列表赋值,复制,深拷贝及5种浅拷贝详解

概述

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

列表赋值

# 定义一个新列表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学习教程会继续为大家更新!初学Python的小伙伴们也要跟着系统的Python学习路线走哦!

原文地址:https://www.cnblogs.com/cherry-tang/p/10972709.html

时间: 2024-10-29 10:45:44

Python学习教程:Python列表赋值,复制,深拷贝及5种浅拷贝详解的相关文章

Python学习路线(Python学习教程_Python学习视频):Python2和Python3你是如何选择的

大家在初学  Python 编程的时候往往都会有一个疑虑,到底是选择 Python 2 还是选择 Python 3 呢?下面跟大家示例解读一下 Python 2 和 Python 3 之间的主要区别! 1. print 语句 python 2 中 print 是一个语句,语句就意味着可以直接跟要打印的东西,不论想输出什么,直接放到 print 关键字后面即可(注:在  Python 2 中想让 print 也当函数使用,可以导入 future 模块 中的 print_function) Pyth

Python学习教程:必须掌握的Cookie知识点都在这里了

今天我们来全面了解一下Cookie(小饼干)相关的知识!篇幅有点长,在学习Python的伙伴或者有兴趣的你,可以耐心看哦! 相信很多同学肯定听过Cookie这个东西,也大概了解其作用,但是其原理以及如何设置,可能没有做过web的同学并不是非常清楚,以前的Python学习教程中其实有跟大家提到过,那今天就带大家详细了解下Cookie相关的知识! 一.诞生背景 爬虫系列教程的第一篇:HTTP详解中我们便说过HTTP的五大特点,而其中之一便是:无状态 HTTP无状态:服务器无法知道两个请求是否来自同一

Python学习教程(Python学习路线):python—收集系统信息

Python学习教程(Python学习路线):python—收集系统信息  1.1 hashlib模块使用 获取文件的MD5值,和shell下的MD5sum一样 方法一:先实例化一个对象,再使用update做校验,最后十六进制查看hexdigest In [3]: import hashlib In [5]: md5 = hashlib.md5 In [6]: md5.update("a") In [7]: md5.hexdigest Out[7]: '0cc175b9c0f1b6a8

Python学习教程(Python学习路线+Python学习视频):Python数据结构

Python学习教程(Python学习路线+Python学习视频):Python数据结构   数据结构引言:   数据结构是组织数据的方式,以便能够更好的存储和获取数据.数据结构定义数据之间的关系和对这些数据的操作方式.数据结构屏蔽了数据存储和操作的细节,让程序员能更好的处理业务逻辑,同时拥有快速的数据存储和获取方式. 在这篇文章中,你将了解到多种数据结构以及这些数据结构在Python中实现的方式.    抽象数据类型和数据结构 数据结构是抽象数据类型(ADT)的实现,通常,是通过编程语言提供的

Python学习教程:人生苦短,我用Python?入门前你要知道这些

有多少伙伴是因为一句 ‘人生苦短,我用Python’就要去学Python的? 之前也大家更新过Python学习教程普及过多次的Python相关知识,不过大家还是还得计划一下Python学习路线!Python入门前,一定要知道这些,你只有了解它,才能深入它! python是什么?  编程开发语言有很多种,通常大家把开发语言划分为静态编译和动态解析语言,静态编译语言有我们常见的c,c++等,动态解析语言有我们常见的python,php等.静态编译语言其中一个明显的特征是:需要对源代码进行编译成可执行

Python学习教程:最全Python110道面试题!面试你肯定用得上!

Python学习教程(Python学习路线):最全Python面试题! 为了大家更好的消化,这里分成几次给大家出题目和教程! 1.一行代码实现1--100之和 利用sum()函数求和 2.如何在一个函数内部修改全局变量 函数内部global声明 修改全局变量 3.列出5个python标准库 os:提供了不少与操作系统相关联的函数 sys: 通常用于命令行参数 re: 正则匹配 math: 数学运算 datetime:处理日期时间 4.字典如何删除键和合并两个字典 del和update方法 5.谈

Python学习教程(Python学习路线):Python面试100题(二)

Python学习教程(Python学习路线):面试题接着给大家整理! 16.<div class="nam">中国</div>,用正则匹配出标签里面的内容(“中国”),其中class的类名是不确定的 17.python中断言方法举例 assert()方法,断言成功,则程序继续执行,断言失败,则程序报错 18.数据表student有id,name,score,city字段,其中name中的名字可有重复,需要消除重复行,请写sql语句 select distinct

2019最新Python学习教程(Python学习路线_Python爬虫教程)爬虫工程师必备的10个爬虫工具

2019最新Python学习教程(Python学习路线_Python爬虫教程)爬虫工程师必备的10个爬虫工具 爬虫工程师必备的10个爬虫工具! 最近很多学爬虫的伙伴让推荐顺手的爬虫工具,总结了一下,把这些好用的爬虫工具都跟你们找齐活了! 磨刀不误砍柴工!都知道工欲善其事必先利其器,那么作为经常要和各大网站做拉锯战的爬虫工程师们,更需要利用利用好身边的一切法器,才能更快的攻破对方防线.这里以日常爬虫流程,给大家介绍十款爬虫工具,相信大家掌握以后,工作效率提高是完全没有问题了! 大家也可以看看有你们

Python学习教程_Python学习路线:Python3里你不知道的秘密特性

Python学习教程_Python学习路线:Python3里你不知道的秘密特性 概述 到2020年,Python2的官方维护期就要结束了,越来越多的Python项目从Python2切换到了Python3.其实在实际工作中,很多伙伴都还是在用Python2的思维写Python3的代码.给大家总结一下Python3一些新的更方便的特性!希望你们看完后也能高效率的编写代码 f-strings (3.6+) 在Python里面,我们经常使用format函数来格式化字符串,例如: user = "Jane