Python中列表和陣列的賦值,淺拷貝和深拷貝

2021-07-24 13:19:49 字數 1288 閱讀 8376

python中列表和陣列的賦值,淺拷貝和深拷貝

列表賦值:

>>> a = [1, 2, 3]

>>> b = a

>>> print b

[1, 2, 3]

>>> a[0] = 0

>>> print b

[0, 2, 3]

解釋:[1, 2, 3]被視作乙個物件,a,b均為這個物件的引用,因此,改變a[0],b也隨之改變

如果希望b不改變,可以用到切片

>>> b = a[:]

>>> a[0] = 0

>>> print b

[1, 2, 3]

解釋,切片a[:]會產生乙個新的物件,占用一塊新的記憶體,b指向這個新的記憶體區域,因此改變a所指向的物件的值,不會影響b

列表深拷貝和淺拷貝

淺拷貝》 import copy

>>> a = [1, 2, 3, [5, 6]]

>>> b = copy.copy(a)

>>> print b

[1, 2, 3, [5, 6]]

>>> print b

[1, 2, 3, [5, 6, 'c']]

深拷貝》 a = [1, 2, 3, [5, 6]]

>>> b = copy.deepcopy(a)

>>> print b

[1, 2, 3, [5, 6]]

拷貝即是開闢一塊新的記憶體空間,把被拷貝物件中的值複製過去。而淺拷貝並沒有為子物件[5,6]開闢一塊新的記憶體空間,而僅僅是實現對a中[5,6]的引用。所以改變a中[5,6]的值,b中的值也會發生變化。

深拷貝則是為子物件也開闢了一塊新空間。所以改變a中[5, 6]的值,並不影響b

陣列賦值不能用切片來達到相同的目的

>>> import numpy as np

>>> a = np.array([1, 2 ,3])

>>> b = a[:]

>>> a[0] = 5

>>> print a, b

[5 2 3] [5 2 3]

如上,雖然用切片,但不能達到修改a而不影響b的目的。說明a,b仍然指向同一塊記憶體。

此時,只能用拷貝

>>> b = a.copy()

>>> a[0] = 5

>>> print a, b

[5 2 3] [1 2 3]

此時修改a不會影響到b。其中的原因以後進一步深究。

注意,列表的拷貝是copy.copy(obj)或copy.deepcopy(obj),陣列的拷貝是obj.copy()

python 函式中的列表賦值

在python中,將列表傳遞給函式,在函式中對列表進行任何修改都是永久性的。但是如果在函式中對傳遞來的列表進行賦值操作,則不會影響列表的資料。這樣一段 def merge sort arr arr 4,6 arr 6,4,8,1,4,2,7,6 merge sort arr print arr 其輸...

列表和陣列的區別

python列表和numpy陣列的區別 numpy使用ndarray物件來處理多維陣列,該物件是乙個快速而靈活的大資料容器。使用python列表可以儲存一維陣列,通過列表的巢狀可以實現多維陣列,那麼為什麼還需要使用numpy呢?numpy是專門針對陣列的操作和運算進行了設計,所以陣列的儲存效率和輸入...

python中矩陣和陣列

我感覺張量是乙個統稱,陣列 矩陣這些都可被稱為張量。矩陣是陣列的特例。當陣列是二維的時候,就可以稱為矩陣。矩陣和二維陣列在某些場合可以通用。建立陣列 建立陣列時,錯誤的 將數值當作引數,array 裡面的引數應該是 9乙個列表或者乙個元組或者說在外觀上已經是乙個陣列了 numpy庫中的array將其...