首页 > 解决方案 > 可变和不可变 Deep/Shallow 复制 Python

问题描述

我有一个关于 Python 如何管理深拷贝和浅拷贝的问题。

从我读到的:

  1. 浅拷贝构造一个新的复合对象,然后(尽可能)将引用插入到原始对象中找到的对象。
  2. 深拷贝构造一个新的复合对象,然后递归地将在原始对象中找到的对象的副本插入其中。

如果你这样做:

a = list() 
b = a
a.append(1)
print(b)

它将显示 b = [1]。如果我更改 b,它将修改 a。如果我更改 a 它会修改 b,因为它们都指向同一个列表...(对吗?)

先感谢您。

标签: python

解决方案


文档

  • 拷贝构造一个新的复合对象,然后(在可能的范围内)将对原始对象中的对象的引用插入其中。
  • 拷贝构造一个新的复合对象,然后递归地将在原始对象中找到的对象的副本插入其中。

此交互式会话可能会帮助您弄清楚浅拷贝和深拷贝之间的区别:

In [91]: import copy

In [92]: z = [100, -1]

In [93]: a = [1, 2, z]

In [94]: b = a

In [95]: c = copy.copy(a)

In [96]: d = copy.deepcopy(a)

In [97]: a[0] = 99

In [98]: z[-1] = 0

In [99]: a
Out[99]: [99, 2, [100, 0]]

In [100]: b
Out[100]: [99, 2, [100, 0]]

In [101]: c
Out[101]: [1, 2, [100, 0]]

In [102]: d
Out[102]: [1, 2, [100, -1]]

请注意,分配b = a不会创建 引用的列表的副本a,它只是将新名称绑定b到该列表。

内存中对象的图形表示可以让您进一步了解这些概念。

Python导师在线截图


推荐阅读