zoukankan      html  css  js  c++  java
  • python直接赋值、切片、浅拷贝和深拷贝

    
    
    import copy

    names = ['Amir', 'Barry', 'Cgakes', 'Dao', [11, 22, 33]]

    # 直接赋值,指向同一个内存地址
    names1 = names

    # 浅拷贝:重新分配一块内存,创建一个新的对象,里面的元素是指原对象中子对象的引用
    names2 = list(names)# 数据类型本身的构造器
    names3 = names1[:] # 切片
    names4 = copy.copy(names)

    # 深拷贝:递归地拷贝原对象中的每一个子对象
    names5 = copy.deepcopy(names)
    names1[0] = 'haha'
    names1[-1][0] = 44

    print(names1)
    print(names2)
    print(names3)
    print(names4)
    print(names5)

    # 输出
    """
    ['haha', 'Barry', 'Cgakes', 'Dao', [44, 22, 33]]#父对象和子对象都指向同一个内存地址
    ['Amir', 'Barry', 'Cgakes', 'Dao', [44, 22, 33]]#父对象独立,子对象都指向同一个内存地址
    ['Amir', 'Barry', 'Cgakes', 'Dao', [44, 22, 33]]#父对象独立,子对象都指向同一个内存地址
    ['Amir', 'Barry', 'Cgakes', 'Dao', [44, 22, 33]]#父对象独立,子对象都指向同一个内存地址
    ['Amir', 'Barry', 'Cgakes', 'Dao', [11, 22, 33]]#父对象和子对象都是独立的
    """
     
    总结:
    赋值就是系统先给一个对象分配了内存地址,然后再将内存地址指向另一个对象,如a=b
    浅拷贝是父对象独立,但是子对象指向同一个内存地址
      通常用数据类型本身的构造器如list(),set()
      python提供的函数copy.copy()可以适用于任何数据类型
      对于可变序列,可以通过切片操作符':'来完成浅拷贝
    深拷贝是和原来的父子对象完全独立,父对象和子对象都指向完全不同的内存地址,copy.deepcopy()
    相同值的可变类型的内存地址是不一样的,但是修改时不需要开辟一块新的空间,只需修改原内存地址就行了
    相同值的不可变类型的内存地址是一样的
  • 相关阅读:
    IT黑马-面向对象
    软路由系统记录
    网工笔记
    肖哥HCNP-正式篇笔记
    肖哥HCNP-学前准备篇笔记
    致良知简短笔记
    黑马班笔记
    正则表达示 for Python3
    小甲鱼Python3笔记
    linux命令-jdk及mysql安装操作
  • 原文地址:https://www.cnblogs.com/z-x-y/p/10567878.html
Copyright © 2011-2022 走看看