在 Python 中复制数组是指创建一个包含原始数组所有元素的新数组的过程。此操作可以通过赋值运算符 (=
) 和 deepcopy()
方法来完成。本章讨论如何将一个数组对象复制到另一个对象。但在详细介绍之前,让我们简要讨论一下数组的概念。
Python 内置的序列类型即列表(list)、元组(tuple)和字符串(string)都是索引化的项集合。然而,与 C/C++、Java 等语言中的数组不同,这些集合中的元素可能具有不同的类型,即它们不是同质的。Python 的 array
模块帮助你创建类似于 Java 数组的对象。
Python 数组可以是字符串、整数或浮点类型。数组类构造函数的使用方法如下:
import array
obj = array.array(typecode[, initializer])
其中 typecode
可以是表示数据类型的字符常量。
使用赋值运算符复制数组
我们可以通过使用赋值运算符 (=
) 将一个数组赋给另一个数组。然而,这样的赋值并不会在内存中创建一个新的数组,而是创建了一个指向同一个数组的新引用。
示例
在下面的例子中,我们使用赋值运算符来复制数组。
import array as arr
a = arr.array('i', [110, 220, 330, 440, 550])
b = a
print("Copied array:", b)
print(id(a), id(b))
上述代码会产生以下输出:
Copied array: array('i', [110, 220, 330, 440, 550])
134485392383792 134485392383792
检查 a
和 b
的 id()
。相同的 id
值确认了简单的赋值并没有创建副本。因为 "a"
和 "b"
引用了同一个数组对象,所以对数组 "a"
的任何更改也会反映在 "b"
上:
a[2] = 10
print(a, b)
上述代码会产生以下输出:
array('i', [110, 220, 10, 440, 550]) array('i', [110, 220, 10, 440, 550])
使用深拷贝复制数组
为了创建数组的另一个物理副本,我们在 Python 库中使用另一个名为 copy
的模块,并在模块中使用 deepcopy()
函数。深拷贝构造一个新的复合对象,然后递归地将原始对象中的副本插入到新对象中。
示例
下面的示例演示了如何在 Python 中复制数组:
import array as arr
import copy
a = arr.array('i', [110, 220, 330, 440, 550])
b = copy.deepcopy(a)
print("Copied array:", b)
执行后,会产生以下输出:
Copied array: array('i', [110, 220, 330, 440, 550])
现在检查 "a"
和 "b"
的 id()
。你会发现 id
是不同的。
print(id(a), id(b))
上述代码会产生以下输出:
2771967069936 2771967068976
这证明了一个新的对象 "b"
已经创建,它是 "a"
的实际副本。如果我们更改 "a"
中的一个元素,则不会反映在 "b"
中。
a[2] = 10
print(a, b)
上述代码会产生以下输出:
array('i', [110, 220, 10, 440, 550]) array('i', [110, 220, 330, 440, 550])