真正理解python的深浅拷贝

24 阅读2分钟

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