开发者学堂课程【Python 入门 2020年版:列表的浅复制】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/639/detail/10300
列表的浅复制
内容介绍
一、引例
二、列表的 copy 方法
三、补充
一、引例
定义一个列表x,使得x和y两者指向同一个内存空间,现在要使得y和x的内容完全一致,但仅改变x不能影响到y。
但此时执行y=x后,改变x[0]的值为1时,再打印y,会发现y的结果被影响。
因为等号表示内存地址的赋值,说明x和y两者指向同一块独立的内存空间。
代码
x = [100,200,300]
#×和y指向了同一个内存空间,会相互影响
y = × x[0] =1 #等号是内存地址的赋值
print(y)
输出结果:
[1,200,300]
二、列表的copy方法
使用列表的copy方法,可以直接将原来的列表进行复制,变成一个新的列表,这种复制方式是浅复制。
1.列表的浅复制
因而此时要使得y改变而不影响x,可以调用copy方法,复制一个和原有列表内容一样,但是指向不同的新列表。我们定义一个z使其赋值x的列表内容,再打印输出x,y,z的地址,可以发现x和y指向同一个内存地址。
代码
x = [100,200,300]
y = × x[0] =1
print(y)
#调用copy方法,可以复制一个列表
#这个新列表和原有的列表内容―样,但是指向不同的内存空间
z.copy()
print(’ 0x%X ,0x%X,0x%X’ % (id(x), id(y), id(z)))
l 输出结果
[1,200,300]
0x27122DA5288,0x27122DA5288,0x27122DA5408
由图可知,x和y两者数据相同且指向同一内存空间,但z是将a的数据复制一份再单独保留,同时指向另一空间
我们不打印x,y和z的下标,删除print(’ 0x%X ,0x%X,0x%X’ % (id(x), id(y), id(z))),我们在更改x中的元素之前复制到z,再将x第一个元素变为1,分别打印输出y和z的结果,可以发现z的内容并没有发生改变,仍未[100,200,300],而y的结果变为[1,200,300]。
代码
x = [100,200,300]
#调用copy方法,可以复制一个列表
#这个新列表和原有的列表内容―样,但是指向不同的内存空间
z.copy()
y = x
x[0] =1
print(y)
print(z)
l 输出结果
[1,200,300]
[100,200,300]
三、补充
1. 浅拷贝和深拷贝之后进行详细讲解。
2.浅拷贝
python中有一个内置的copy模块,同时a = copy.copy (x)和x. Copy()的效果一样,可以调用列表的copy方法,也可以使用列表的copy模块传入。
#除了使用列表自带的copy方法以外,还可以使用copy模块实现拷贝
import copy //导入内置模块
a = copy.copy (x) #效果等价于x. Copy(),都是一个浅拷贝
#深拷贝 今后再讲解
3. 切片其实就是一个浅拷贝
(1)示例1:
定义一个名为names的列表,若想有一个内容一样但修改不影响的列表,我们可以使用copy或切片:name2 =name1[::],
同时print(names1,names2)输出后的结果一样,因为切片语法中中括号[]含有两个冒号表示从头切到尾。
l 代码
names1 =[‘张三’,’李四’,’王五','杰克']
names2 =names1[::]
//表示将names1的值切片后赋给names2
print(names1,names2)
l 输出结果
[‘张三’,’李四’,’王五','杰克'] [‘张三’,’李四’,’王五','杰克']
(2)示例2:
但将names1的值切片后赋给names2,再把names1的第一个数值变为jerry,打印输出names2,发现names2的值并未发生变化,说明与浅拷贝一致,切片后的内容一样,但地址并不同。
l 代码
names1 =[‘张三’,’李四’,’王五','杰克']
names2 =names1[::]
//表示将names1的值切片后赋给names2
names1[0] =’jerry’
print(names2)
l 输出结果
[‘张三’,’李四’,’王五','杰克']