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

Python中的数组是按值分配还是按引用分配?,python,arrays,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] 但修改原始数组的元素时,对复制的数组没有影响: arr = [1,2,3] arr1 = arr del arr[:] print(arr1) #this prints []

我想知道为什么删除原始阵列时会影响复制的阵列:

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]
但修改原始数组的元素时,对复制的数组没有影响:

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]

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

您没有修改原始数组的元素,而是为
arr
变量重新分配了一个新列表。如果您正确地访问了它的元素,那么您对元素更改的直觉将反映在
arr1
中,因为列表在Python中是可变的。比如说,

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

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

arr1 = arr
不是其中之一(在
C
-speak中,这只是一个带别名的指针)。试一试

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.. ;-)

在这些更改之后,您将看到对
arr1
arr
的更改是独立的(当然,如果您使用的是浅拷贝,那么列表中的项目将被共享)。

您没有对列表进行完整复制,而只是重新分配了变量名

要制作列表的深度副本,请执行以下操作:

arr1 = [x for x in arr]

python中的对象将被认为是通过引用传递的。然而,这和那有点不同

arr = [1, 2, 3]
这句话有两个作用。首先,它在内存中创建一个列表对象;其次,它将“arr”标签指向该对象

arr1 = arr
此语句创建一个新标签“arr1”,并将其指向arr指向的同一列表对象

现在,在原始代码中,您执行了以下操作:

del arr[:]
arr = [4, 5, 6]
这删除了列表对象的元素,现在任何指向它的标签都将指向空列表。在第二批代码中,您执行了以下操作:

del arr[:]
arr = [4, 5, 6]
这在内存中创建了一个新的列表对象,并将“arr”标签指向它。现在,内存中有两个列表对象,每个对象由两个不同的标签指向。我刚刚检查了控制台,arr指向[4,5,6],arr1指向[1,2,3]


这是一篇关于它的好文章:

除了没有修改原始数组的元素外,您被分配给了变量。可能重复的是列表。无论如何,Python中的每个变量本质上都是一个对象引用。