一般的復制
- #encoding:utf-8
- #定義一個嵌套集合
- lista=[1,2,3,[4,5,6,[7,8,9]]]
- listb=lista
- #分別打印出 lista和listb的地址值
- print id(lista) #4511103096
- print id(listb) #4511103096
- #修改lista中的內容,listb中的內容也會跟著修改
- lista[0]=0
- print lista #[0, 2, 3, [4, 5, 6, [7, 8, 9]]]
- print listb #[0, 2, 3, [4, 5, 6, [7, 8, 9]]]
通過以上實踐會發現,復制操作就是將lista在內存中指向的地址,也讓listb指向他,本身并沒有在內存中創建地址。
淺拷貝
- #encoding:utf-8
- #定義一個嵌套集合
- import copy
- lista=[1,2,3,[4,5,6,[7,8,9]]]
- #使用copy模塊中copy方法
- listb=copy.copy(lista)
- print id(lista) #4396231640
- print id(listb) #4396231712
- #發現lista和listb在內存中的地址有區別,
- #打印元素中的第一個元素的地址值
- print id(lista[0])#140666751466536
- print id(listb[0])#140666751466536
- #元素的地址值是一樣的,是不是意思就是,改變lista中的第一個元素,
- # listb中的也要改變呢
- lista[0]=0
- print lista #[0, 2, 3, [4, 5, 6, [7, 8, 9]]]
- print listb #[1, 2, 3, [4, 5, 6, [7, 8, 9]]]
- #結果發現,竟然沒有跟著lista一起改變,為什么呢,因為使用了淺拷貝唄
- #我們在打印下lista[0]和listb[0]的地址
- print id(lista[0]) #140666751466560
- print id(listb[0]) #140666751466536
- #會發現lista[0]重新指向內存中的其他地址
- #這時候可以通過以上的方法,修改lista[3],lista[3]也是一個list
- print id(lista[3])#4499779240
- print id(listb[3])#4499779240
- #修改lista[3]中第一個元素呢
- lista[3][0]=0
- print lista #[0, 2, 3, [0, 5, 6, [7, 8, 9]]]
- print listb #[0, 2, 3, [0, 5, 6, [7, 8, 9]]]
- #發現修改lista[3][0]元素的值,listb[3][0]也會跟著改變
根據以上實踐說明,淺拷貝對對象中對象沒有拷貝。
深拷貝
- #encoding:utf-8
- #定義一個嵌套集合
- import copy
- lista=[1,2,3,[4,5,6,[7,8,9]]]
- #深拷貝功能是在淺拷貝上做的加強,所以具備淺拷貝的功能
- listb=copy.deepcopy(lista)
- lista[3][0]=0
- print lista #[1, 2, 3, [0, 5, 6, [7, 8, 9]]]
- print listb #[1, 2, 3, [4, 5, 6, [7, 8, 9]]]
- #深拷貝會解決修改lista[3][0]值不會影響listb中的值
- #再來修改下第三層列表中元素是不是也完成拷貝
- lista[3][3][0]=0
- print lista #[1, 2, 3, [0, 5, 6, [0, 8, 9]]]
- print listb #[1, 2, 3, [4, 5, 6, [7, 8, 9]]]
- #沒有受到任何影響
本站歡迎任何形式的轉載,但請務必注明出處,尊重他人勞動成果
轉載請注明: 文章轉載自:愛思資源網 http://www.randomwithlife.com/show-18-1110-1.html
轉載請注明: 文章轉載自:愛思資源網 http://www.randomwithlife.com/show-18-1110-1.html