五、列表V总结(浅拷贝和深拷贝)
1.一维列表
1.1 浅拷贝
方法1: 将x列表拷贝到y列表,修改x列表的值,y列表也会相应随着改变。
下图将两个变量指向同一个列表,然后通过下标来修改列表中的元素的值,改的是列表的内容,而非变量的引用,才会牵一发而动全身。
将x列表赋值给y,即y=x,当赋值运算发生时,python并不是将数据放到变量里面去,而是将变量与数据进行挂钩,这个行为称为引用。将一个变量赋值给另一个变量,其实就是将一个变量的引用传递给另一个变量。
1.2. 得到两个独立的列表(一维列表)
方法一: x.copy()
修改x列表的值,y列表不变。
方法二: 利用切片的方法,y=x[ : ]
2.二维列表(嵌套列表):
2.1 浅拷贝(二维列表)
修改x的值,y随之改变。
浅拷贝只拷贝了外层对象,如果包含嵌套对象的话,那么拷贝的只是其引用。
2.2 浅拷贝
需要导入copy()模块。
copy.copy(列表)
import copy
x=[[1,2,3],[4,5,6],[7,8,9]]
y=copy.copy(x) #模块.函数名
x[1][1]=0
y
[[1, 2, 3], [4, 0, 6], [7, 8, 9]]
2.3 深拷贝
deepcopy()
深拷贝修改x列表的值,y列表不发生改变。
deepcopy()函数将原对象拷贝的同时,也将对象中所有引用的子对象进行了拷贝。
课后题:
0.请问你是如何理解 ”在 Python 中,变量不是盒子” 这句话的?
答:在一些编程语言中,经常会有“变量就是盒子”这样的比喻,因为赋值操作就像是往盒子里面放东西。但在 Python 中变量并不是一个盒子,当赋值运算发生的时候,Python 并不是将数据放进变量里面,而是将变量与数据进行挂钩,这个行为我们称之为引用。
- 请问下面代码执行后,x == y 返回的结果是 True 还是 False?
x = [1, 2, 3]
y = x
y[1] = 1
x == y
True
列表x和列表y指向的是同一个内存。
- 请问下面代码实现的是浅拷贝还是深拷贝?
x = [[1, 2, 3], [4, 5, 6]]
y = x[:]
答:浅拷贝
- 请问下面代码执行后,列表 x 和 y 的内容分别是什么?
x = [[1, 2, 3], [4, 5, 6]]
y = x.copy()
y.append(7)
y[1].append(8)
答:代码执行后,列表 x 变成 [[1, 2, 3], [4, 5, 6, 8]],列表 y 变成 [[1, 2, 3], [4, 5, 6, 8], 7]。
调用列表的 copy() 方法实现的是浅拷贝,浅拷贝,只能拷贝第一层数据,其余仅拷贝其引用。
y.append(7) 是往列表 y 添加一个新元素 7,这一步操作对列表 x 并不会产生任何影响;
但是,y[1].append(8) 是往列表 y 的内嵌列表添加一个新元素,由于是浅拷贝,所以两个内嵌的列表是 x 和 y 共享的,该操作也会对列表 x 产生影响。
题目来自小甲鱼: 列表V