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()
    相同值的可变类型的内存地址是不一样的,但是修改时不需要开辟一块新的空间,只需修改原内存地址就行了
    相同值的不可变类型的内存地址是一样的
  • 相关阅读:
    Linux系统的关机、重启、睡眠
    Java 读写Properties配置文件
    Java识别操作系统
    Java DES 加解密("DES/CBC/PKCS5Padding")
    Java获取本机IP
    编写SHELL脚本--编写简单脚本
    配置yum软件仓库(redhat 7.0)
    简单的redis测试
    Seaslog安装和参数配置
    mac使用phpize进行安装的时候碰到的问题
  • 原文地址:https://www.cnblogs.com/z-x-y/p/10567878.html
Copyright © 2011-2022 走看看