Python中的数组是按值还是按引用分配的?

时间:2017-01-20 19:11:42

标签: python arrays

我想知道为什么当我删除原始数组时会影响复制的数组:

arr = [1,2,3]
arr1 = arr
del arr[:]
print(arr1) #this prints []

但是当我修改原始数组的元素时,对复制的数组没有影响:

arr = [1,2,3]
arr1 = arr
arr = [4,5,6]
print(arr1) #this prints [1,2,3]

如果有人能解释这个问题,我感谢您的帮助,提前谢谢。

4 个答案:

答案 0 :(得分:5)

您没有修改原始数组的元素,而是将新列表重新分配给arr变量。如果您正确访问其元素,那么您对思想变化的直觉将反映在arr1中,因为在Python中列表是 mutable 。例如,

arr = [1,2,3]
arr1 = arr
arr[1] = 4
print(arr1) #this prints [1,4,3]

答案 1 :(得分:1)

有几种方法可以复制数组,但是

arr1 = arr

不是其中之一(在C中 - 说,这只是一个别名指针)。尝试其中一个

arr1 = arr[:]  # slice that includes all elements, i.e. a shallow copy
arr1 = copy.copy(arr)  # from the copy module, does a shallow copy
arr1 = copy.deepcopy(arr)  # you guessed it.. ;-)

在其中任何一项后,您会看到对arr1arr的更改是独立的(当然,如果您使用的是浅色副本,那么 列表中的项目将被分享)。

答案 2 :(得分:1)

python中的对象将被视为通过引用传递。然而,它有点不同。

arr = [1, 2, 3]

这句话做了两件事。首先,它在内存中创建一个列表对象;第二,它指的是" arr"标签到这个对象。

arr1 = arr

此语句创建一个新标签" arr1"并将其指向arr。指向的同一列表对象。

现在,在您的原始代码中,您执行了此操作:

del arr[:]

这删除了列表对象的元素,现在指向它的任何标签都将指向一个空列表。在您的第二批代码中,您执行了此操作:

arr = [4, 5, 6]

这在内存中创建了一个新的列表对象,并指出了#34; arr"给它贴上标签。现在,内存中有两个列表对象,每个列表对象由两个不同的标签指向。我刚刚检查了我的控制台,arr指向[4,5,6]和arr1指向[1,2,3]。

这是一篇很好的帖子:http://robertheaton.com/2014/02/09/pythons-pass-by-object-reference-as-explained-by-philip-k-dick/

答案 3 :(得分:-2)

您没有完成列表的完整副本,而只是重新分配了变量名称。

为了制作列表的深层副本,请执行以下操作:

arr1 = [x for x in arr]