zoukankan      html  css  js  c++  java
  • python 深拷贝和浅拷贝


    Python专门提供了一种拷贝机制,基于原对象创建一个含有相同值的对象。拷贝有copy模块提供。讲到拷贝就不得不讲一下可变和不可变对象。

    可变对象

    当该数据类型的对应变量的值发生了改变,那么它对应的内存地址也会发生改变,对于这种数据类型,称之为可变对象。
    数据类型:list,set,dict

    不可变对象

    当该数据类型的对应变量的值发生了改变,那么它对应的内存地址不发生改变,对于这种数据类型,称之为可变数据类型。
    数据类型:num,str,tuple等

    浅拷贝

    是对于一个对象的顶层拷贝,也就是说拷贝引用。

    • 对列表切片拷贝:[:]
    • 调用对象拷贝:list.copy
    • 模块:copy.copy

    深拷贝

    是对于一个对象的内容拷贝。

    • 模块:copy.deepcopy()

    那么它们的异同在哪呢?

    可变对象 不可变对象
    浅拷贝 拷贝外面的对象,里面元素不拷贝 拷贝新对象
    深拷贝 对象和里面的元素都拷贝 拷贝新对象

    实例

    import copy
    # 可变对象数据
    change_variable=[1,2,45,6,0]
    # 不可变对象数据
    not_variable=(3,5,2,1,)
    
    # 浅拷贝:拷贝引用(可变)
    change_shallow_list=change_variable[:]
    # 深拷贝:拷贝内容(可变)
    change_deep_list=copy.deepcopy(change_variable)
    
    # 浅拷贝:拷贝引用(不可变)
    not_shallow_tuple=copy.copy(not_variable)
    # 深拷贝:拷贝内容(不可变)
    not_deep_tuple=copy.copy(not_variable)
    
    # 当浅拷贝对象发生改变时
    change_shallow_list[-1]='改变'
    change_deep_list[1]='改变了'
    
    # 当深拷贝对象发生改变时
    try:
        not_shallow_tuple[0]=111
    except Exception as f:
        print(f,'
    元组不管是什么拷贝,本身不可变')
    try:
        not_deep_tuple[-1]='深拷贝'
    except Exception as f:
        print(f,'
    元组不管是什么拷贝,本身不可变')
    
    print('可变对象l:	{}'.format(change_variable))
    print('不可变对象t:	{}'.format(not_variable))
    print('浅拷贝可变对象:	{}'.format(change_shallow_list))
    print('深拷贝可变对象:	{}'.format(change_deep_list))
    print('浅拷贝不可变对象:	{}'.format(not_shallow_tuple))
    print('深拷贝不可变对象:	{}'.format(not_deep_tuple))
    
  • 相关阅读:
    rm
    Linux下解包/打包,压缩/解压命令
    虚拟机安装---vm12+ubuntukylin16.04
    mysql-5.6.41-winx64安装
    tensorflow学习笔记一------下载安装,配置环境(基于ubuntu16.04 pycharm)
    大一上学期C语言学习心得总结
    常见HTTP状态码
    Java语言基础及java核心
    linux下安装JMeter(小白教程)
    Linux下安装JDK(小白教程)
  • 原文地址:https://www.cnblogs.com/Ink-kai/p/12470536.html
Copyright © 2011-2022 走看看