python之深浅拷贝

发布时间:2019-09-08 09:10:08编辑:auto阅读(1656)

    深浅拷贝

    对于 数字 和 字符串 而言,赋值、浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址。

    import copy
    # ######### 数字、字符串 #########
    n1 = 123
    # n1 = "age 10"
    print(id(n1))
    # ## 赋值 ##
    n2 = n1

    print(id(n2))


    # ## 浅拷贝 ##
    n2 = copy.copy(n1)
    print(id(n2))
     
    # ## 深拷贝 ##
    n3 = copy.deepcopy(n1)
    print(id(n3))


    对于字典、元组、列表而言,进行赋值、浅拷贝和深拷贝时,其内存地址的变化是不同的。

    赋值,只是创建一个变量,该变量指向原来内存地址,如:

    >>> n1 = {"k1": "zhangshan", "k2": 123, "k3": ["lisi", 456]}

    >>> n2 = n1

    >>> print id(n1)

    11195200

    >>> print id(n2)

    11195200

    wKiom1lcROjjEh8xAAAXptnQHpo075.png-wh_50


    浅拷贝,在内存中只额外创建第一层数据

    >>> n1 = {"k1": "zhangshan", "k2": 123, "k3": ["lisi", 456]}

    >>> n3 = copy.copy(n1)

    >>> print id(n1)

    11267952

    >>> print id(n3)

    11151792

    >>> print id(n1['k3'])  ##查看内存地址相同

    139853825328696

    >>> print id(n3['k3'])  ##查看内存地址相同

    139853825328696


    wKiom1lcR1bxJO5bAAAojoI_Hfw379.png-wh_50

    深拷贝,在内存中将所有的数据重新创建一份(排除最后一层,即:python内部对字符串和数字的优化)

    >>> import copy

    >>> n1 = {"k1": "zhangshan", "k2": 123, "k3": ["lisi", 456]}

    >>> n4 = copy.deepcopy(n1)

    >>> print id(n1)

    11193264

    >>> print id(n4)

    11249664

    >>> print id(n1['k3'])  ##查看内存地址不同

    139853635849824

    >>> print id(n2['k3'])  ##查看内存地址不同

    139853635827256

    wKioL1lcc-DyEEJxAAA0CjbBOMk892.png-wh_50


    深浅拷贝应用场景

    监控场景:更改拷贝后的数据,而原来的数据保持不变!

    脚本如下:

    #!/usr/bin/env python

    #coding: utf8


    import copy


    #目的是更改数据后,原来的数据不变,而拷贝后的数据会随时更新!


    dic = {

    "cpu":[80,],

    "mem":[80,],

    "disk":[80,]

    }

    print("before:",dic)


    #new_dic = copy.copy(dic)     ##浅拷贝后的数据更新会把原来和新的字典内容的数据都更新!

    new_dic = copy.deepcopy(dic)   ##深拷贝只更新拷贝后的数据,而原来的数据保留不变!

    new_dic["cpu"][0] = 50

    print(dic)

    print(new_dic)


    输出内容:

    before: {'cpu': [80], 'mem': [80], 'disk': [80]}

    {'cpu': [80], 'mem': [80], 'disk': [80]}

    {'cpu': [50], 'mem': [80], 'disk': [80]}

关键字