Python中的拷贝

Python的拷贝和C/C++的差别很大,很经常就容易搞混,因此记录一下。

赋值、拷贝

  • 赋值:实际上就是对象的引用,没有开辟新的内存空间
    1
    2
    lst=[1,2,3]
    l=lst
  • 浅拷贝:创建了新对象,但是内容是对原对象的引用,有三种形式

    1. 切片

      1
      2
      l=lst[:]
      l=[i for i in lst]
    2. 工厂

      1
      l=list(lst)
    3. copy

      1
      2
      import copy
      l=copy.copy(lst)
  • 深拷贝:copy中的deepcopy,生成一个全新的对象,与原来的对象无关

    1
    2
    import copy
    l=copy.deepcopy(lst)

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
### 引用https://www.cnblogs.com/huangbiquan/p/7795152.html 的例子###
>>> import copy
>>> a = [1,2,3,4,['a','b']] #定义一个列表a
>>> b = a #赋值
>>> c = copy.copy(a) #浅拷贝
>>> d = copy.deepcopy(a) #深拷贝

>>> a.append(5)
>>> print(a)
[1, 2, 3, 4, ['a', 'b'], 5] #a添加一个元素5
>>> print(b)
[1, 2, 3, 4, ['a', 'b'], 5] #b跟着添加一个元素5
>>> print(c)
[1, 2, 3, 4, ['a', 'b']] #c保持不变
>>> print(d)
[1, 2, 3, 4, ['a', 'b']] #d保持不变

>>> a[4].append('c')
>>> print(a)
[1, 2, 3, 4, ['a', 'b', 'c'], 5] #a中的list(即a[4])添加一个元素c
>>> print(b)
[1, 2, 3, 4, ['a', 'b', 'c'], 5] #b跟着添加一个元素c
>>> print(c)
[1, 2, 3, 4, ['a', 'b', 'c']] #c跟着添加一个元素c
>>> print(d)
[1, 2, 3, 4, ['a', 'b']] #d保持不变

#说明如下:
#1.外层添加元素时, 浅拷贝c不会随原列表a变化而变化;内层list添加元素时,浅拷贝c才会变化。
#2.无论原列表a如何变化,深拷贝d都保持不变。
#3.赋值对象随着原列表一起变化

Reference

https://www.cnblogs.com/huangbiquan/p/7795152.html
https://www.cnblogs.com/xueli/p/4952063.html