1. 程式人生 > >Python3.5(十)深淺拷貝問題

Python3.5(十)深淺拷貝問題

第一個 com 發生 字典 創建 pytho 有變 占用 ron

可變對象-不可變對象

在Python中不可變對象指:一旦創建就不可修改的對象,包括字符串,元祖,數字

在Python中可變對象是指:可以修改的對象,包括:列表、字典

>>> L1 = [2,3,4]      #L1變量指向的是一個可變對象:列表  
>>> L2 = L1           #將L1值賦給L2後,兩者共享引用同一個列表對象[1,2,3,4]  
>>> L1[0] = 200       #因為列表可變,改變L1中第一個元素的值  
>>> L1; L2            #改變後,L1,L2同時改變,因為對象本身值變了  
[200, 3, 4] [200, 3, 4]

如果不想改變列表L2的值,有兩種方法:切片 copy模塊

>>> L1 = [2,3,4]   
>>> L2 = L1  
>>> id(L1);id(L2)     #共享引用一個可變對象  
45811784L  
45811784L  
>>> L2 = L1[:]        #切片操作  
>>> id(L1);id(L2)     #切片後,對象就不一樣了  
45811784L  
45806920L  
>>> L1[0] = 200  
>>> L1;L2             #
L1發生改變,L2沒有變化 [200, 3, 4] [2, 3, 4]

【拷貝】

1. 切片技術應用於所有的序列,包括:列表、字符串、元祖

但切片不能應用於字典。對字典只能使用D.copy()方法或D.deepcopy()方法.

技術分享

2. 深淺拷貝,即可用於序列,也可用於字典

>>> import copy

>>> X = copy.copy(Y) #淺拷貝:只拷貝頂級的對象,或者說:父級對象

>>> X = copy.deepcopy(Y) #深拷貝:拷貝所有對象,頂級對象及其嵌套對象。或者說:父級對象及其子對象

如果字典只有頂級對象

技術分享

  • 如果字典中嵌套對象:

技術分享

D和C1變,C2不變

【結論】

  • 深淺拷貝都是對源對象的復制,占用不同的內存空間
  • 如果源對象只有一級目錄的話,源做任何改動,不影響深淺拷貝對象
  • 如果源對象不止一級目錄的話,源做任何改動,都要影響淺拷貝,但不影響深拷貝
  • 序列對象的切片其實是淺拷貝,即只拷貝頂級的對象

轉載http://blog.csdn.net/jerry_1126/article/details/41852591

Python3.5(十)深淺拷貝問題