Python基础(五):列表的深浅复制

首先我们需要明确列表的深浅复制是针对被嵌套的列表而言的,也就是说只有对嵌套列表我们才需要考虑这个问题。来看例子。

list1=[‘老大‘,‘老二‘,[‘老三‘,‘老四‘,‘老五‘],‘老六‘,‘老七‘]
list2=list1.copy()
print(list1,‘\n‘,list2)                    #打印两个列表
print(id(list1),‘\n‘,id(list2))          #打印两个列表的地址
print(id(list1[2]),‘\n‘,id(list2[2])) #打印两个嵌套列表的地址

运行结果

[‘老大‘, ‘老二‘, [‘老三‘, ‘老四‘, ‘老五‘], ‘老六‘, ‘老七‘]
 [‘老大‘, ‘老二‘, [‘老三‘, ‘老四‘, ‘老五‘], ‘老六‘, ‘老七‘]
3072878348
 3072561644
3072841164
 3072841164

从结果中可以看出,虽然list1与liat2的地址相同,但是嵌套的列表[‘老三‘, ‘老四‘, ‘老五‘]却有着相同的地址。这就是一种浅复制。如果此时我们修改嵌套列表的值。两个列表就都会发生改变。看下面的代码。

list1[2][1]=‘哈哈哈‘
print(list1,‘\n‘,list2)

运行结果

[‘老大‘, ‘老二‘, [‘老三‘, ‘哈哈哈‘, ‘老五‘], ‘老六‘, ‘老七‘]
 [‘老大‘, ‘老二‘, [‘老三‘, ‘哈哈哈‘, ‘老五‘], ‘老六‘, ‘老七‘]

其实原理非常简单,中间被嵌套的列表实际上是单独被分配的空间,然后list1和list2都是去引用的地址,所以当它的值改变,两个列表就都跟着变了。

深复制

深复制需要用到copy模块,来看例子。

import copy
list1=[‘老大‘,‘老二‘,[‘老三‘,‘老四‘,‘老五‘],‘老六‘,‘老七‘]
list2=copy.deepcopy(list1)
print(list1,‘\n‘,list2)    #打印两个列表
print(id(list1),‘\n‘,id(list2))    #打印两个列表的地址
print(id(list1[2]),‘\n‘,id(list2[2])) #打印两个嵌套列表的地址

结果

[‘老大‘, ‘老二‘, [‘老三‘, ‘老四‘, ‘老五‘], ‘老六‘, ‘老七‘]
 [‘老大‘, ‘老二‘, [‘老三‘, ‘老四‘, ‘老五‘], ‘老六‘, ‘老七‘]
3071562732
 3071928940
3071600076
 3071600108

这是我们如果修改嵌套的列表的值,两个列表会发生什么变化呢?

list1[2][1]=‘哈哈哈‘
print(list1,‘\n‘,list2)

结果

[‘老大‘, ‘老二‘, [‘老三‘, ‘哈哈哈‘, ‘老五‘], ‘老六‘, ‘老七‘]
 [‘老大‘, ‘老二‘, [‘老三‘, ‘老四‘, ‘老五‘], ‘老六‘, ‘老七‘]

原文地址:https://www.cnblogs.com/austinjoe/p/9379289.html

时间: 2024-10-09 10:04:47

Python基础(五):列表的深浅复制的相关文章

python基础三(列表和元组)

数据结构:数据结构是以某种方式(如通过编号)组合起来的数据元素集合.在python中,最基本的数据结构为序列,序列中每个元素都有编号从0开始. 1.序列概述:?python内置了许多种序列,列表.元组.字符串等.?列表和元组的不同在于,列表是可以修改的,而元组不可以,这意味着列表用于需要中途添加元素的情形,而元组适用于禁止修改元素的情形. 1.1.创建列表 假设你现在需要一个东西来储存多个名字,那么用列表正合适 list_name = ["王晓明","李二"] #所

python基础之列表

Python基础之列表 一.列表的切片与增删改查 li = ['李白','韩信','兰陵王','娜可露露','赵云','露娜','王昭君'] #切片与字符串一样,索引值都是从0开始,所用得方法都一样[:][:-1][0:-1][2:4][:4][4:][1:-2:2][1:-3:-2] #列表增append(),insert li.append('关羽') #后面加入['李白', '韩信', '兰陵王', '娜可露露', '赵云', '露娜', '王昭君', '关羽'] print(li) li

python基础之列表篇

LIST: 简介:列表是python中最基本的数据结构之一,每个元素都会被分配一个数字也就是索引,亦称为下标.他的第一个元素对应的索引为0,第二个对应的索引为1,以此类推. 一, 列表的声明与赋值 #列表的声明 list1 = ['pisa','heitang','lurou','mianhuatang'] list2 = ['cat','dog','pig'] list3 = ['softdrink','wine','bear'] 二,列表的查询 ''' 如何读取列表中的元素? ''' lis

python基础之列表(list)

本文主要讨论python中列表的性质和列表的一些内置方法. 一.列表的定义和性质 1.列表的定义: 列表是python中的内置内的一种,在python中的类的关键字是list.列表的定义如下: li=[12.'hello',344,[12,23,'hshs']] 列表是由[]标志的.列表中的元素用","分隔开.列表的元素可以是数字,字符串,元组,字典. 2.列表的性质 (1)列表可以通过索引查找元素 li=[1,2,3,4] s=li[3] print[s] 列表的索引从0开始,最后一

2.python基础之—列表,元组,字典,集合,字符串的使用方法

一.关于python序列的简介. python里面的序列大部分都可以执行,索引,切片,加,乘,检查长度,以及检查某个成员是否存在,甚至还可以找出这个序列中最小的元素和最大的元素,并且序列都是可迭代的. 解释下个人理解的迭代,迭代(iteration),序列中的迭代就是对序列中的每个元素重复执行某些操作/ 具体的迭代方式后面会说到. 下面就说说python序列的共有特点. 1.索引 一个序列中,所有的元素都有自己的编号,这个编号是从0开始的,这个编号就是所谓的索引,这些元素可以通过索引来依次访问.

【python基础】列表方法汇总

一.列表 定义:用于存储一组数据的有序序列 语法声明:[元素1, 元素2, 元素3, ...] 二.特点 1.列表是有序的 2.列表中可以存储重复的数据 3.列表中可以存储不同数据类型的数据 4.列表是一个可变的数据类型;可以修改的 三.方法 1.增 (1).append(obj) 末尾追加 (2).insert(index, obj) 在指定位置添加元素 (3).extend(iterable) 可迭代对象(序列), 将序列中的元素一次性的追加在列表的末尾 (4)+ (5)* 2.删 (1).

python基础(列表)

列表是最通用的Python复合数据类型,列表中包含以逗号分隔,并在方括号([])包含的项目. 在一定程度上,列表相似C语言中的数组,它们之间的一个区别是,所有属于一个列表中的项目可以是不同的数据类型的. 存储在一个列表中的值可以使用切片(分片)操作符来访问([]和[:])用索引从0开始,在列表的开始位置和结束为-1. 加号(+)符号列表连接运算符,星号(*)重复操作. list = ['abcd', 123, 2.23, 'Ethon'] tinylist = [123,'wakey'] pri

Python基础2 列表、字典、集合

本节内容 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1. 列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 names = ['Alex',"Tenglan",'Eric'] 通过下标访问列表中的元素,下标从0开始计数 >>> names[0] 'Alex' >>> names[2] 'Eric' >>> names[-1] 'Eric'

Python基础:列表的使用

一.定义: list列表,使用[ ]定义,可以嵌套元组.列表.字典. 相比元组,除了定义使用中括号,还多出了增加.修改.删除元素的方法. Python里经常使用的数据结构. 二.访问列表: exp_list = ['one', 'this', 'is', 'a', 'tuple', 2, 3, 4, 5] exp_list[起始位置:结束位置:步长] #从左向右,第一个元素的位置是0 #从右向左,第一个元素地位置是-1 #读取的元素个数 = 结束位置 - 起始位置 #从起始位置开始读取 #步长: