一、= 赋值

      =是一个运算符,表示把=右边的值,赋值给左边。其实,这个赋值过程,只是把,右边值在内存中的地址,赋值给了左边。代码支持:

 

lst1 = ['a', 'b', [1, 2]]
lst2 = lst1
print(id(lst1),id(lst2))
lst1.append('c')
print(lst1)
print(lst2)
结果:
997818360456 997818360456
['a', 'b', [1, 2], 'c']
['a', 'b', [1, 2], 'c']
997818362120 997818362120
['a', 'b', [1, 2, 3], 'c']
['a', 'b', [1, 2, 3], 'c']

 

     可以看出,lst2lst1的所有值都得到了。上一张图,帮助理解。

                                

二、深浅拷⻉

  1. 浅拷贝

    谈到浅拷贝,就会出现一个方法---copy(),这个方法就是把对象进行浅拷贝的。

    适用于list列表,set集合,dict字典,其他数据,没有此方法。代码展示一下,copy前后的结果。

 

lst1 = ['a', 'b', [1, 2]]
lst2 = lst1.copy()
lst1[2].append(3)
lst1.append('c')
print(id(lst1))
print(id(lst2))

print(id(lst1[2]))
print(id(lst2[2]))

print(lst1)
print(lst2)
结果:
219912462984
219912465352
474036693256
474036693256
['a', 'b', [1, 2, 3], 'c']
['a', 'b', [1, 2, 3]]

       由上面程序输出的结果可以得到一个结论,复制后,lst2lst1不一样了,拥有了自己的内存空间,地址是:219912465352。但是[1,2],这个列表中的元素的地址却被复制到lst2中了,所以在结尾追加3时,lst2中也打印出3。由地址,也可以看出,两者是一样的地址。

      画了一张图,如下:

 

  1. 深度拷贝(深度克隆,原型模式)

           深度拷贝,使用与几乎所有数据类型。会把所有的内容进行拷贝,包括第二层,第三层等。看代码说话:

import copy
lst1 = ['a', 'b', [1, 2]]
lst2 = copy.deepcopy(lst1)
print(id(lst1), id(lst2))
print(id(lst1[2]), id(lst2[2]))
print(lst2)
print(lst1)
lst1.append('c')
lst1[2].append(3)
print(lst2)
print(lst1)
结果:
876803976200 876805465224
876803976136 876805465416
['a', 'b', [1, 2]]
['a', 'b', [1, 2]]
['a', 'b', [1, 2]]
['a', 'b', [1, 2, 3], 'c']

  使用深度拷贝时,需要导包,import copy。可以看出lst1lst2在内存中的地址不一样了,而且,里面的元素[1,2],列表在内存中的地址也不一样了。因此,无论后面lst1怎么追加数据,都不会影响到lst2。可以通过下图,再次理解一下。