一、is与==的区别
- is 是比较两个引用是否指向了同一个对象(引用比较)
- == 是比较两个对象的值是否相等(值比较)
例:
a = [11, 22, 33]
b = [11, 22, 33]
c = a
print(id(a))
print(id(b))
print(id(c))
print(a == b)
print(a is b)
print(a is c)
二、深拷贝、浅拷贝
1.浅拷贝
只拷贝最顶层
a = [11, 22, 33]
b = a
import copy
a = [11, 22, 33]
b = copy.copy(a)
print(id(a))
print(id(b))
import copy
a = [11, 22]
b = [33, 44]
c = [a, b]
d = copy.copy(c)
print(id(c))
print(id(d))
a.append(55)
print(c)
print(d)
2.深拷贝
递归拷贝所有的数据
import copy
a = [11, 22]
b = [33, 44]
c = [a, b]
d = copy.deepcopy(c)
print(id(c))
print(id(d))
a.append(55)
print(c)
print(d)
三、拷贝的其他方式
a = [11, 22]
b = [33, 44]
c = [a, b]
d = c[:]
print(id(c))
print(id(d))
a.append(55)
print(c)
print(d)
字典的copy方法:
b = dict(name='xx', age=18, cars=[100, 200, 300])
c = b.copy()
print(b)
print(c)
print(id(b))
print(id(c))
b['cars'].append(10)
print(b)
print(c)
四、深拷贝与浅拷贝的总结
1. 浅拷贝对不可变类型和可变类型的copy不同
- copy.copy 对于可变类型,会进行浅拷贝
- copy.copy 对于不可变类型,不会拷贝,仅仅是指向
import copy
a = [11, 22, 33]
b = (11, 22, 33)
c = copy.copy(a)
d = copy.copy(b)
print(id(a), id(c))
print(id(b), id(d))
2. copy.copy 与 copy.deepcopy 的区别
浅拷贝:
a = [11, 22]
b = (a,)
c = [b]
d = copy.copy(c)
print(id(c), id(d))
深拷贝:
a = [11, 22]
b = (a,)
c = [b]
d = copy.deepcopy(c)
print(id(c), id(d))
a.append(33)
print(c)
print(d)
五、总结
1.如果是仅仅使用赋值运算符,那么一定是引用复制 2.如果是使用copy.copy,则要分2种:如果最顶层是不可变类型,那么就是复制引用;如果顶层是可变类型,那么就是浅拷贝,即只拷贝最顶层的 3.如果使用的是copy.deepcopy,那么一定是递归拷贝,即全部复制
|