Python中的賦值、深拷貝與淺拷貝(內存地址)


Python中的賦值、深拷貝與淺拷貝(內存地址)

 

1、python中的可變對象與不可變對象

(1) 可變對象:dict,list

def dict_test():
    a = {}
    b = a
    print(id(a))                     # 140367329543360                    
    a['a'] = 'hhhh'
    print('id a:' + str(id(a)))      # id a:140367329543360
    print('a:' + str(a))             # a:{'a': 'hhhh'}
    print('id b:' + str(id(b)))      # id b:140367329543360
    print('b:' + str(b))             # b:{'a': 'hhhh'}

if __name__ == '__main__':
    dict_test()

 

內存變化如下:

 

 

(2) 不可變對象:int,string,float,tuple

def int_test(): 
    i = 77
    j = 77
    print(id(77))                    #140396579590760
    print('i id:' + str(id(i)))      #i id:140396579590760
    print('j id:' + str(id(j)))      #j id:140396579590760
    print i is j                     #True
    j = j + 1
    print('new i id:' + str(id(i)))  #new i id:140396579590760
    print('new j id:' + str(id(j)))  #new j id:140396579590736
    print i is j                     #False

if __name__ == '__main__':
    int_test()

內存分配如下:

 

2、賦值、淺拷貝與深拷貝:

    (1) b = a: 賦值引用,a 和 b 都指向同一個對象。

         

    (2) b = a.copy(): 淺拷貝, a 和 b 是一個獨立的對象,但他們的子對象還是指向統一對象(是引用)。

         

    (3) b = copy.deepcopy(a): 深度拷貝, a 和 b 完全拷貝了父對象及其子對象,兩者是完全獨立的。

         

3、更多實例:

#!/usr/bin/python
# -*-coding:utf-8 -*-
 
import copy
a = [1, 2, 3, 4, ['a', 'b']]       #原始對象
 
b = a                              #賦值,傳對象的引用
c = copy.copy(a)                   #對象拷貝,淺拷貝
d = copy.deepcopy(a)               #對象拷貝,深拷貝
 
a.append(5)                        #修改對象a
a[4].append('c')                   #修改對象a中的['a', 'b']數組對象
 
print( 'a = ', a )
print( 'b = ', b )
print( 'c = ', c )
print( 'd = ', d )

運行結果如下:

('a = ', [1, 2, 3, 4, ['a', 'b', 'c'], 5])
('b = ', [1, 2, 3, 4, ['a', 'b', 'c'], 5])
('c = ', [1, 2, 3, 4, ['a', 'b', 'c']])
('d = ', [1, 2, 3, 4, ['a', 'b']])

 

4、按照具體需求選擇合適的賦值或者拷貝形式:

     建議:在內存足夠的情況下,選擇深拷貝,這樣邏輯處理獨立,不會產生上下文的影響,不容易發生難以解決的bug。

 


免責聲明!

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



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