zoukankan      html  css  js  c++  java
  • Python


    内置模块 copy

    深浅拷贝

    • 对于不可变对象(数字,字符串,元组等),深浅拷贝等同于赋值操作 (v2 = copy(v1),等同于 v2 = deepcopy(v1),等同于v2 = v1。
    • 对于可变的对象(列表,字典,集合等)深浅拷贝的本质是,申请新的空闲内存单元,并将变量名指向该内存单元的首地址,但浅拷贝内部元素的地址指向不变,深拷贝内部元素的地址指向变化

    # 注意:由于拷贝对于不可变对象等同于赋值操作,所以你会发现列表中的不可变元素无论深浅拷贝地址指向不变
    
    # 浅拷贝-方式一: [:]
    >>> l1 = [['5', '2', '1'], ['1', '3', '1', '4']]
    >>> id(l1)
    4401079144
    >>> map(id, l1)
    [4401099336, 4401100056]
    >>> l2 = l1[:]
    >>> id(l2)
    4401085328
    >>> map(id, l2)
    [4401099336, 4401100056]
    
    # 浅拷贝方式二: copy.copy(x)
    >>> import copy
    >>> l1 = [['5', '2', '1'], ['1', '3', '1', '4']]
    >>> id(l1)
    4401085040
    >>> map(id, l1)
    [4401079144, 4401083672]
    >>> l2 = copy.copy(l1)
    >>> id(l2)
    4402468120
    >>> map(id, l2)
    [4401079144, 4401083672]
    
    # 深拷贝方式一: copy.deepcopy(x, memo=None, _nil=[])
    >>> import copy
    >>> l1 = [['5', '2', '1'], ['1', '3', '1', '4']]
    >>> id(l1)
    4402559960
    >>> map(id, l1)
    [4402560248, 4401062328]
    >>> l2 = copy.deepcopy(l1)
    >>> id(l2)
    4401072536
    >>> map(id, l2)
    [4401100344, 4401101136]
    
    • 深浅拷贝的应用场景在于模版化,如模拟ZABBIX模版,主机/主机组应用并可自定义模版参数,但并不影响源模版
    >>> import copy
     
    >>> a = '123'
    >>> y = copy.copy(a)  # 浅拷贝
    >>> id(a)
    4322676048
    >>> id(y)
    4322676048
    
    >>> y = copy.deepcopy(a) # 深拷贝,和浅拷贝效果一样
    >>> id(y)
    4322676048
     
    
    >>> l = ['1','2','3']
    >>> x = copy.copy(l)
    
    >>> id(l)
    4322239336
    >>> id(x)
    4322239120
    
    >>> id(l[0])
    4320359368
    >>> id(x[0])
    4320359368
    
    
    >>> x = copy.deepcopy(l)
    >>> id(x)
    4322237544
    >>> id(l)
    4322239336
    
    >>> id(x[0])
    4320359368
    >>> id(l[0])
    4320359368
    

    当列表中存在可变对象时,深拷贝后,可变对象地址会被改变

    >>> l = ['1','2','3',['1','2']]
    >>> x = copy.deepcopy(l)
    
    >>> id(x)
    4322239336
    
    >>> id(l)
    4322213040
    
    
    >>> id(x[0])  # 可变对象元素相同
    4320359368
    
    >>> id(l[0])
    4320359368
    
    >>> id(x[-1])  # 这是一个可变元素
    4322213688
    
    >>> id(l[-1])
    4322239120
    
    
    >>> x = copy.copy(l)  # 浅拷贝,地址都相同
    
    >>> id(l[-1])
    4322239120
    
    >>> id(x[-1])
    4322239120
    
    

  • 相关阅读:
    Python基础之基本数据类型
    Python基础之变量
    mysql数据库
    进程与线程
    并发编程
    网络编程
    内置函数(魔法方法)
    组合,封装,访问限制机制,property装饰器
    面向对象之继承
    Web开发中最致命的8个小错误
  • 原文地址:https://www.cnblogs.com/fldev/p/14373247.html
Copyright © 2011-2022 走看看