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()
    相同值的可变类型的内存地址是不一样的,但是修改时不需要开辟一块新的空间,只需修改原内存地址就行了
    相同值的不可变类型的内存地址是一样的
  • 相关阅读:
    nacos安装配置和部署教程
    springcloudstream整合rabbitmq
    Springboot整合swagger2
    git命令详解
    Mybatis 注解开发传入List 两种方式接收方式 在IN场景中
    java 根据时间段查询数据库
    stream分页
    201521123068《Java程序设计》第1周学习总结
    201521123027 《JAVA程序设计》第二周学习总结
    201521123027 《JAVA程序设计》第一周学习总结
  • 原文地址:https://www.cnblogs.com/z-x-y/p/10567878.html
Copyright © 2011-2022 走看看