zoukankan      html  css  js  c++  java
  • python之浅拷贝与深拷贝

    浅拷贝与深拷贝:

    在python中对一个变量进行复制时,会分为浅拷贝与深拷贝。

    • 一般的赋值语句都类似于浅拷贝,即只拷贝对象的引用地址,而不是内容本身,当被拷贝对象发生了改变,
      这个变量也会跟着改变。
    • python中拷贝对象,要先导入copy模块。import copy
    • copy.copy():浅拷贝,创建一个新的对象,拷贝的是对象的引用。会随着拷贝对象的改变而改变。
    • copy.deepcopy():深拷贝,创建一个新的对象,拷贝的是对象的内容。独立于拷贝对象。
    # 赋值
    >>> a = [1,2,3]
    >>> b = a
    >>> id(a)
    140529081869448
    >>> id(b)
    140529081869448
    
    # 浅拷贝 和 深拷贝
    >>> import copy
    >>> a = [1,2,3]
    >>> b = [4,5,6]
    >>> c = [a,b]
    >>> d = copy.copy(c)
    >>> e = copy.deepcopy(c)
    >>> id(c)
    140529081869448
    >>> id(d)
    140529112566728  // 创建的新对象
    >>> id(e)
    140529081869704  // 创建的新对象
    # 向对象中添加新元素
    >>> a.append(4)
    >>> d
    [[1, 2, 3, 4], [4, 5, 6]]  // 浅拷贝随着原拷贝对象的改变而改变
    >>> e 
    [[1, 2, 3], [4, 5, 6]]  // 深拷贝独立于原拷贝对象
    # 原拷贝对象
    >>> c
    [[1, 2, 3, 4], [4, 5, 6]]
    
    

    copy.copy()支持检测数据类型:

    >>> a = [1,2,3]
    >>> b = [4,5,6]
    >>> c = [a,b] // 可变类型:列表
    >>> d = copy.copy(c)
    >>> id(c)
    140529081869256 
    >>> id(d)
    140529081863688 // 创建一个新对象
    
    >>> e = [1,2,3]
    >>> f = [4,5,6]
    >>> g = (e,f) // 不可变类型:元组
    >>> h = copy.copy(g) 
    >>> id(g)
    140529112564104
    >>> id(h)
    140529112564104  // 与原拷贝对象的id一致,说明并没有创建一个新对象,而是直接指向了原拷贝对象的引用
    

    更详细的介绍可以参看这个博客: url:http://blog.csdn.net/qq_32907349/article/details/52190796

  • 相关阅读:
    1436 孪生素数 2
    1702 素数判定 2
    第五章 Spring3.0 、Hibernate3.3与Struts2的整合 基于Annotation
    逻辑服务器和数据缓存服务器交互方式整理
    Solr学习(2) Solr4.2.0+IK Analyzer 2012
    hdu4288 Coder
    解决Robotium测试用例crash问题
    FineUI_动态绑定Grid
    Protection 5 ---- Priviliege Level Checking 2
    用户权限管理
  • 原文地址:https://www.cnblogs.com/AimeeCodeWorld/p/7766635.html
Copyright © 2011-2022 走看看