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中的赋值深拷贝与浅拷贝(内存地址)的主要内容,如果未能解决你的问题,请参考以下文章

python深拷贝与浅拷贝

Python中深拷贝与浅拷贝区别

python的深拷贝与浅拷贝

深拷贝与浅拷贝

python中的深拷贝与浅拷贝

Python3 深拷贝与浅拷贝总结