笨方法學python豆瓣 python深淺拷貝

2021-10-11 12:39:23 字數 2200 閱讀 2095

python深淺拷貝

一、引言

在python中,物件賦值實際上是物件的引用。當建立乙個物件,然後把他賦值給另外乙個變數的時候,python並沒有拷貝這個物件,而是拷貝了這個物件的引用。

針對列表l1=['a','b','c',['d','e','f']]一般有三種方法,分別為:拷貝(賦值)、淺拷貝、深拷貝。

注意:拷貝、淺拷貝、深拷貝都是針對可變型別資料而言的

1.1 可變 or 不可變

id 不變值可變,即在原理的基礎上修改,則為可變資料型別;值變id也變,即從新申請乙個空間放入新值,則為不可變的資料型別。

age = 19

print('first:',id(age))

age = 20

print('second:',id(age))

#輸出:

first: 140731004973888

second: 140731004973920

x = 10

y = 20

print('x:', id(x), 'y', id(y))

x, y = y, x

print('x:', id(x), 'y', id(y))

#輸出:

x: 140731004973600 y 140731004973920

x: 140731004973920 y 140731004973600

二、拷貝

如果l2是l1的拷貝物件,則l1內部的任何資料型別的元素變化,則l2內部的元素也會跟著變化,因為可變型別值變id不變。

l1 = ['a','b','c',['d','e','f']]

l2 = l1

print(l1)

#輸出:

['a', 'b', 'c', ['d', 'e', 'f'], 'g']

print(l2)

#輸出 :

['a', 'b', 'c', ['d', 'e', 'f'], 'g']

三、淺拷貝

如果l2是l1的淺拷貝物件,則l1內的不可變元素發生了改變,l2不變。如果l1內的可變元素發生l改變,則l2會跟著改變。

import copy

l1 = ['a','b','c',['d','e','f']]

l2 = copy.copy(l1)

print(l1)

#輸出:

['a', 'b', 'c', ['d', 'e', 'f'], 'g']

print(l2)

#輸出:

['a', 'b', 'c', ['d', 'e', 'f']]

print(l1)

#輸出:

['a', 'b', 'c', ['d', 'e', 'f', 'g'], 'g']

print(l2)

#輸出:

['a', 'b', 'c', ['d', 'e', 'f', 'g']]

四、深拷貝

如果l2 是l1 的深拷貝物件,則l1內的不可變元素發生了改變,l2不變。

如果l1內的可變元素發生了改變,l2也不會改變,即l2 是永遠不會因為l1 的變化而變化的。

import copy

l1 = ['a','b','c',['d','e','f']]

l2 = copy.deepcopy(l1)

print(l1)

#輸出:

['a', 'b', 'c', ['d', 'e', 'f'], 'g']

print(l2)

#輸出:

['a', 'b', 'c', ['d', 'e', 'f']]

print(l1)

#輸出:

['a', 'b', 'c', ['d', 'e', 'f', 'g'], 'g']

print(l2)

#輸出:

['a', 'b', 'c', ['d', 'e', 'f']]

總結牢記: 拷貝/淺拷貝/深拷貝 只針對可變資料型別

拷貝: 當lt2為lt的拷貝物件時,lt內的可變型別變化,lt2變化;lt內的不可變型別變化,lt2變化,拷貝就是簡單的賦值

淺拷貝:當lt2為lt的淺拷貝物件時,lt內的可變型別變化,lt2變化;lt內的不可變型別變化,lt2不變化,實現用copy.copy() 可變資料的型別中的內建方法.copy()

深拷貝: 當lt2為lt的深拷貝物件時,lt內的可變型別變化,lt2不變化;lt內的不可變型別變化,lt2不變

笨方法學python

書結構非常簡單,其實就是 52 個習題而已。其中 26 個覆蓋了輸入輸出 變數 以及函式三個課題,另外 26 個覆蓋了一些比較高階的話題,如條件判斷 迴圈 類和物件 測試 以及專案的實現等。每一章節的格式基本都是一樣的,以 練習題開始,讀者照著說明 編寫 不允許複製貼上 執行並檢查結果,然後再做一下...

笨方法學python 一

print i like typing this print this is fun print i said do not touch this.如果用同種引號會報錯 file ex1.py line 8 print i said do not touch this.syntaxerror inv...

學習筆記 笨方法學python

1.1 列表和字典 列表是有一組任意型別的值構成的有序列表,他由方括號構造而成 number list 1,2,3,4 mylist 1,a b 2,4 字典是由一組明值對構成的無序集合,由大括號構造而成 ages 可以通過以下方式訪問列表和字典中的元素 mylist 2 return a ages...