Python中的赋值深拷贝与浅拷贝(内存地址)
Posted fcyh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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。
以上是关于Python中的赋值深拷贝与浅拷贝(内存地址)的主要内容,如果未能解决你的问题,请参考以下文章