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將其...