Python中关于复制存在不小的细节
关于"="复制
a = [1, 2, 3], b = a
实际上a与b指向同一内存,即b是a的别名。
所以当赋值b[0] = 4时,a[0]也被赋值为4
关于copy复制
a = [1, 2, 3], b = a.copy()
此时a与b是指向不同内存的指针,
但是,a[0]与b[0]仍然指向同一块内存
关于切片复制
a = [1, 2, 3], b = a[:]
此时a与b是指向不同内存的指针,
a[0]与b[0]仍然指向同一块内存
关于deepcopy复制
import copy
a = [1, 2, 3], b = copy.deepcopy(a)
此时a与b指向不同内存,a[i]与b[i]仍指向同一内存
但是
当通过deepcopy复制二维列表时会有所不同
稍等一下,"=" 还没有聊完
a = [[1], [2], [3]], b = a.copy()
我们知道 id(a) != id(b)
但是 id(a[i]) == id(b[i])
接下来,我们试试修改b[0]
b[0].append(0)
没出意外,a[0]==[1,0]
那我们试一试 b[0]={}
没错,将b[0]定义为空字典
此时a[0] 仍然是 [1,0],而且 id(a[0]) != id(b[0])
现在,得到一个结论,因为python中变量不需要显式定义,那么当一个变量通过"="修改了数据类型时,相当于new
还没完,不妨再试试
a = 1
add1 = id(a)
a = 2
add2 = id(a)
add1 != add2
现在得到进一步结论,通过"="赋值时,即使不修改变量类型,依然是new
所以 最终的结论:= != "="