• 一个简单例子记住深拷贝和浅拷贝


    深拷贝和浅拷贝一直是python应聘岗位必考题之一,要想理解透彻,还是要写个实际例子从== 和 is进行分析。

    深拷贝和浅拷贝的用法:

    语法:

      浅拷贝:copy.copy()       

      深拷贝:copy.deepcopy()

    赋值操作:=

    一。首先进入python命令行模式或者交互模式:

      python/python3     ipython/ipython3

    二。导入copy

      import copy

    三。写个小例子

    >>> import copy
    >>> a = [1,2,'hello',[1,2]]
    
    >>> b1 = a  # 赋值操作的b1
    >>> id(a)
    140694383590144
    >>> id(b1)
    140694383590144
    # 可见赋值操作 内存地址一样
    
    >>> b2 = copy.copy(a) # 浅拷贝的b2
    >>> b2
    [1, 2, 'hello', [1, 2]]  
    >>> id(b2)
    140694383742920
    # 可见浅拷贝内容一样,内存地址不一样
    
    >>> b3 = copy.deepcopy(a) # 深拷贝的b3
    >>> b3
    [1, 2, 'hello', [1, 2]]
    >>> id(b3)
    140694383667896
    # 可见深拷贝内容一样,内存地址不一样
    
    >>> a is b1
    True
    >>> a is b2
    False
    >>> a is b3
    False
    # 可见赋值的内存地址一样;无论深拷贝,还是浅拷贝内存地址都是不一样的
    
    >>> a[0] = 2
    >>> a[-1].append(0)
    # 此时开始改变a原数据-----注意是改变原数据,不是新增东西
    >>> a
    [2, 2, 'hello', [1, 2, 0]]
    >>> b1
    [2, 2, 'hello', [1, 2, 0]]
    >>> b2
    [1, 2, 'hello', [1, 2, 0]]
    >>> b3
    [1, 2, 'hello', [1, 2]]
    # 可见只有深拷贝不跟大部队走,保持一开始的数据
    
    >>> a.append(5)
    >>> a
    [2, 2, 'hello', [1, 2, 0], 5]
    # 现在是改变原有数据,新增一个元素
    >>> b1
    [2, 2, 'hello', [1, 2, 0], 5]
    # 赋值操作,内容依旧跟着变化
    >>> b2
    [1, 2, 'hello', [1, 2, 0]]
    # 此时,浅拷贝的b2并没有跟着大部队走了,还是保持原有(第二次的变化)的4个元素,没有新增第五个元素
    >>> b3
    [1, 2, 'hello', [1, 2]]
    # 深拷贝的b3,自始至终没有改变

    四。总结以下几点:

    - 赋值:内容一样,内存地址一样
    - 浅拷贝:生成一个新对象,开辟新的内存空间,数据为原数据的引用,如a=[1,2,'he',[1,2]] 如果a append在最后加一个数据是就变成新的数据,就不是原数据,所以浅拷贝的b数据不变,如果是在原数据基础上如把a[0]位置变为5,浅拷贝的b也会变化
    - 深拷贝:生成一个新对象,开辟一个新的内存空间,数据为原数据,一旦原数据a有变化与深拷贝的c毫无关系

    实践出真知~
  • 相关阅读:
    python字符串
    php设计模式 ---单例模式.
    PHP设计模式---策略模式
    PHP设计模式---适配器模式
    PHP设计模式---抽象工厂模式
    windows下安装redis
    PHP基础知识汇总(四)
    PHP面向对象整理
    PHP基础知识汇总(三)
    PHP基础知识汇总(二)
  • 原文地址:https://www.cnblogs.com/NolaLi/p/8633172.html
Copyright © 2020-2023  润新知