1 深浅拷贝数据准备
- 可变类型 list dict set
- 不可变类型 str int float bool tuple
a = [1, 2, [1, 22], {'a': 111, 'b': 222}, {111, 222}, (1111, 2222), 'a', 'b']
2 浅拷贝
结论
- 内部元素地址不变,只有最外层的发生变化。
# 1 浅拷贝 copy等价于切片
import copy
# a1 = copy.copy(a)
a1 = a[:]
print(id(a))
print(id(a1))
print(id(a[2]))
print(id(a1[2]))
print(id(a[3]))
print(id(a1[3]))
# 2797704622400
# 2797704623552
# 2797697523904
# 2797697523904
# 2797697522880
# 2797697522880
3 深拷贝
结论
- 最外层地址发生变化
- 内部可变类型数据的地址发生变化
- 内部不可变类型数据的地址未发生变化
- 不是传说中的是有的都会拷贝一份切记。
- 由此可见我们所谓的不可变的无论你深浅拷贝它的id都是不会发生变化的
# 2 深拷贝
a1 = copy.deepcopy(a)
# 测试第一部分
# print(id(a))
# print(id(a1))
# print(id(a[2]))
# print(id(a1[2]))
# print(id(a[3]))
# print(id(a1[3]))
# print(id(a[0]))
# print(id(a1[0]))
# print(id(a[2][1]))
# print(id(a1[2][1]))
# print(id(a[3]['a']))
# print(id(a1[3]['a']))
# 测试第二部分
print(id(a[4]))
print(id(a1[4]))
print(id(a[5]))
print(id(a[5]))
print(id(a1[5][0]))
print(id(a1[5][0]))
# 2372120187552
# 2372125741280
# 2372120169792
# 2372120169792
# 2372117773328
# 2372117773328
补充
- 相同的不可变类型的数据赋值给不同的变量那么不同变量的id是一样的
- 相同的可变类型的数据赋值给不同的变量那么不同变量的id是不一样的
a = 1
b = 1
c = 'hello'
d = 'hello'
g = ['hello1']
h = ['hello1']
e = ('1', )
f = ('1', )
print(a is b)
print(c is d)
print(e is f)
print(id(e))
print(id(f))
print('=======')
print(id(g))
print(id(h))
print(g is h)
# True
# True
# True
# 2632536130560
# 2632536130560
# =======
# 2632536187072
# 2632543351104
# False