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

2022-09-07 02:33:11 字數 4601 閱讀 5368

一、賦值操作並沒有建立新列表,只是記憶體位址的賦值操作,兩個列表的記憶體位址是一樣的

= 賦值操作並不會建立新物件,只是把乙個變數的記憶體位址賦值給另乙個變數

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)

print("

old_lst:

", old_lst)

print("

new_lst:

", new_lst)

執行結果:

32645384

32645384old_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)

print("

old_lst:

", old_lst)

print("

new_lst:

", new_lst)

執行結果:

43655432

43656456old_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[:]

print

(id(old_lst))

print

(id(new_lst))

print("

old_lst:

", old_lst)

print("

new_lst:

", new_lst)

執行結果:

43524296

43525384old_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)

print("

old_lst:

", old_lst)

print("

new_lst:

", new_lst)

執行結果:

43524360

43525384old_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()

print

(id(old_lst))

print

(id(new_lst))

print("

old_lst:

", old_lst)

print("

new_lst:

", new_lst)

執行結果:

43720904

43721992old_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)

print("

old_lst:

", old_lst)

print("

new_lst:

", new_lst)

執行結果:

37430600

37446088old_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)

print

(id(old_lst))

print

(id(new_lst))

print("

old_lst:

", old_lst)

print("

new_lst:

", new_lst)

執行結果:

43787592

43804168old_lst: [1, [2, 3, 666]]

new_lst: [1, [2, 3]]

四、函式的預設值引數型別如果是可變型別的,注意,這個引數是共享的(大坑哦)(不可變引數:str bool int tuple

1.1 例項一

def func(lst=):

print

(id(lst), lst)

func()

func()

func()

執行結果:

36175624 [123]

36175624 [123, 123]

36175624 [123, 123, 123]

1.2 例項二

函式的預設值引數型別如果是可變型別的,注意,這個引數是共享的(大坑哦)

def func(lst=):

print

(id(lst), lst)

func()

func()

func()

執行結果:

43384584 [123]

43394440 [123]

43384584 [123, 123]

python3 列表和元組

序列是python中最基本的資料結構。序列中的每個元素都分配乙個數字 它的位置,或索引,第乙個索引是0,第二個索引是1,依此類推。最後乙個為 1,倒數第二個為 2,以此類推。這就意味著我們可以從第乙個元素向前或向後計數了。索引示例 greeting hello greeting 0 h greeti...

python3 列表練習

python 列表綜合練習 使用 python 語言建立空列表 score,按學號順序 由小到大 儲存多個學生 一門課程的考試成績。呼叫列表操作的常用函式實現以下功能 1 建立乙個空列表 score 68,87,92,100,76,88,54,89,76,61 3 輸出score 列表中第 3 個元...

python3 列表函式

python中列表是可變的,這是它區別於字串和元組的最重要的特點,一句話概括即 列表可以修改,而字串和元組不能。列表函式 含義把乙個元素新增到列表的結尾,相當於 a len a x list.extend l 通過新增指定列表的所有元素來擴充列表,相當於 a len a l。list.insert ...