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。
