zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    解决CentOS6.5虚拟机克隆后无法上网(网卡信息不一致)的问题
    Linux密码保护
    破解Linux系统开机密码
    Linux常用命令
    人教版中小学教材电子版下载
    作业一
    实验四
    实验一
    实验三
    实验二
  • 原文地址:https://www.cnblogs.com/yjd_hycf_space/p/11923106.html
Copyright © 2011-2022 走看看