== 和 is
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| a = [11,22,33] b = [11,22,33] a == b # True 你的苹果6 和我的苹果6型号一样的 a is b # False 你的苹果6 不是我的苹果6
id(a) # 139804120094600 id(b) # 139804120094640
# 此时 c = a # 把a的地址给了c id(a) # 139804120094600 id(c) # 139804120094600 id(b) # 139804120094640
a is c True
|
- == 是比较两个对象内容是否相等
- is 是比较两个引用是否指向同一个对象(引用比较)
注意点单纯的值类型(这个问题以后讲) 在一定范围内 a is b 是 True的
1 2 3 4 5 6 7 8
| a = 100 b = 100 a == b # True a is b # True
a = 10000 b = 10000 a is b # False
|
浅拷贝
1 2 3 4
| a = [1,2,3] b = a id(a) # 地址1001 id(b) # 地址1001
|
深拷贝
1 2 3 4 5 6
| import copy a = [1,2,3] c = copy.deepcopy(a) # 深拷贝 [1,2,3]
id(a) # 地址1001 id(c) # 地址1211
|
问题1多重嵌套的列表拷贝之后拷贝的是地址还是内容?
1 2 3 4 5 6 7 8 9 10 11
| a = [1,2,3] b = [4,5,6] c = [a,b] # c是一个二维的列表
d = copy.deepcopy(c) # 深拷贝
c[0] # [1,2,3] d[0] # [1,2,3]
c[0].append(4) # [1,2,3,4] d[0] # [1,2,3]
|
元组同上也会进行深拷贝
copy模块的方法
- copy.copy(xxx) 如果是可变类型仅进行一层拷贝,如果是不可变类型不进行拷贝(浅拷贝)
- copy.deepcopy(xxx) 递归的进行拷贝无论多少层
copy的坑
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| a = [1,2,3] b = [4,5,6] c = [a,b] # c是一个二维的列表 d = copy.copy(c)
# 仅进行第一层拷贝 id(c) # 地址100 id(d) # 地址110
c[0].append(4) # [1,2,3,4] d[0] # [1,2,3,4]
# 元组又有例外 a = [1,2,3] b = [4,5,6] c = (a,b) d = copy.copy(c)
id(c) # 地址1100 id(d) # 地址1100
|
copy.copy去拷贝一个不可变类型时不进行拷贝,可变类型拷贝一层