Python021==和 is和深浅拷贝

== 和 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去拷贝一个不可变类型时不进行拷贝,可变类型拷贝一层