python3 列表的賦值和深淺拷貝(大坑哦)


一、賦值操作並沒有創建新列表,只是內存地址的賦值操作,兩個列表的內存地址是一樣的
= 賦值操作並不會創建新對象,只是把一個變量的內存地址賦值給另一個變量
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]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM