一、賦值操作並沒有創建新列表,只是內存地址的賦值操作,兩個列表的內存地址是一樣的
= 賦值操作並不會創建新對象,只是把一個變量的內存地址賦值給另一個變量
old_lst = [1, 2, 3] new_lst = old_lst print(id(old_lst)) print(id(new_lst)) print("old_lst:", old_lst) print("new_lst:", new_lst) old_lst.append(666) print("old_lst:", old_lst) print("new_lst:", new_lst)
執行結果:
32645384 32645384 old_lst: [1, 2, 3] new_lst: [1, 2, 3] old_lst: [1, 2, 3, 666] new_lst: [1, 2, 3, 666]
二、 淺拷貝:copy淺拷貝,只拷貝一層內容,復制一個表面,更深層次的內容,只拷貝一個內存地址。淺拷貝可以通過兩種方式實現,一種是切片賦值,一種是copy()函數
拷貝的意義:快速的創建對象。
1.1.列表切片賦值 兩個列表的內存地址不一樣(簡單的列表,列表元素不包括列表類型)
old_lst = [1, 2, 3] new_lst = old_lst[:] print(id(old_lst)) print(id(new_lst)) print("old_lst:", old_lst) print("new_lst:", new_lst) old_lst.append(666) print("old_lst:", old_lst) print("new_lst:", new_lst)
執行結果:
43655432 43656456 old_lst: [1, 2, 3] new_lst: [1, 2, 3] old_lst: [1, 2, 3, 666] new_lst: [1, 2, 3]
1.2.列表切片賦值 兩個列表的內存地址不一樣(復雜些的列表,列表元素包括列表類型)
old_lst = [1, [2, 3]] new_lst = old_lst[:] old_lst[1].append(666) print(id(old_lst)) print(id(new_lst)) print("old_lst:", old_lst) print("new_lst:", new_lst)
執行結果:
43524296 43525384 old_lst: [1, [2, 3, 666]] new_lst: [1, [2, 3, 666]]
2.1.淺拷貝,只拷貝一層,copy() 兩個列表的內存地址不一樣(簡單的列表,列表元素不包括列表類型)
old_lst = [1, 2, 3] new_lst = old_lst.copy() print(id(old_lst)) print(id(new_lst)) print("old_lst:", old_lst) print("new_lst:", new_lst) old_lst.append(666) print("old_lst:", old_lst) print("new_lst:", new_lst)
執行結果:
43524360 43525384 old_lst: [1, 2, 3] new_lst: [1, 2, 3] old_lst: [1, 2, 3, 666] new_lst: [1, 2, 3]
2.2.淺拷貝,只拷貝一層,copy() 兩個列表的內存地址不一樣(復雜些的列表,列表元素包括列表類型)
old_lst = [1, [2, 3]] new_lst = old_lst.copy() old_lst[1].append(666) print(id(old_lst)) print(id(new_lst)) print("old_lst:", old_lst) print("new_lst:", new_lst)
執行結果:
43720904 43721992 old_lst: [1, [2, 3, 666]] new_lst: [1, [2, 3, 666]]
三、深拷貝:把內容完全的復制一份
import copy
copy.deepcopy()
兩個列表的內存地址不一樣,兩個列表沒有任何的關聯了
1.1(簡單的列表,列表元素不包括列表類型)
import copy
old_lst = [1, 2, 3] new_lst = copy.deepcopy(old_lst) print(id(old_lst)) print(id(new_lst)) print("old_lst:", old_lst) print("new_lst:", new_lst) old_lst.append(666) print("old_lst:", old_lst) print("new_lst:", new_lst)
執行結果:
37430600 37446088 old_lst: [1, 2, 3] new_lst: [1, 2, 3] old_lst: [1, 2, 3, 666] new_lst: [1, 2, 3]
1.2(復雜些的列表,列表元素包括列表類型)
import copy
old_lst = [1, [2, 3]] new_lst = copy.deepcopy(old_lst) old_lst[1].append(666) print(id(old_lst)) print(id(new_lst)) print("old_lst:", old_lst) print("new_lst:", new_lst)
執行結果:
43787592 43804168 old_lst: [1, [2, 3, 666]] new_lst: [1, [2, 3]]
四、函數的默認值參數類型如果是可變類型的,注意,這個參數是共享的(大坑哦)(不可變參數:str bool int tuple)
1.1 實例一
def func(lst=[]): lst.append(123) print(id(lst), lst) func() func() func()
執行結果:
36175624 [123] 36175624 [123, 123] 36175624 [123, 123, 123]
1.2 實例二
函數的默認值參數類型如果是可變類型的,注意,這個參數是共享的(大坑哦)
def func(lst=[]): lst.append(123) print(id(lst), lst) func() func([]) func()
執行結果:
43384584 [123] 43394440 [123] 43384584 [123, 123]