关于Python中多维列表的复制问题所引出等号的秘密

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

所以 最终的结论:= != "="

发布了8 篇原创文章 · 获赞 4 · 访问量 2202

猜你喜欢

转载自blog.csdn.net/yyccsdnzh/article/details/105040790
今日推荐