zoukankan      html  css  js  c++  java
  • 09 Python3 的深拷贝与浅拷贝

    • 深、浅拷贝不止 Python 有

    不妨从用法上看

    • 保险的做法就是使用 copy.deepcopy
    >>> import copy
    >>> a = [1, 2, 3, [4, 5, 6]]
    >>> b = copy.deepcopy(a)
    >>> 
    
    • 数据只有“一层”的话,使用分片或内置方法 copy()copy.copy 就行
    >>> a = [1, 2, 3]
    >>> b = a[:]
    >>> c = a.copy()
    >>> 
    >>> import copy
    >>> d = copy.copy(a)
    >>> 
    
    • 数据只有“一层”的话,使用工厂函数也行
    >>> a = [1, 2, 3]
    >>> b = list(a)
    

    补充

    • 复合对象谈深、浅拷贝才有意义
    • 复合对象:包含其他对象的对象,如列表、类实例等

    • 浅拷贝只拷贝第一层元素,故又称“顶层拷贝”
    • 若超过一层,浅拷贝后,“外壳”指向新的空间,其内部的元素仍指向原对象内部的元素
    • 可以认为 Python 能“偷懒”时必“偷懒”,有变化才分配内存
    • copy.deepcopy 也不是万能的,必要的时候可以重写方法

    • 常见的不可变对象,如 str, int, float, complex, bool,可以放心拷贝
    • tuple 有点特殊,虽然是不可变对象,但有层数,所以拷贝时需要注意“深浅”
    • 常见的可变对象,如 list, dict,拷贝时需要注意“深浅”
    • set 有点特殊,虽然是可变对象,但它的元素是可哈希的,也就意味着它里面是不可变对象,所以可以放心拷贝
  • 相关阅读:
    CQL
    gossip协议
    Cassandra删除数据的坑
    Cassandra维护数据一致性的策略
    Cassandra查询出错
    string的 insert
    数字游戏(数学推理
    deque
    暗黑字符串(递推
    最大的奇约数和
  • 原文地址:https://www.cnblogs.com/yorkyu/p/10328162.html
Copyright © 2011-2022 走看看