博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python的赋值、浅拷贝、深拷贝
阅读量:6394 次
发布时间:2019-06-23

本文共 1785 字,大约阅读时间需要 5 分钟。


在写dict数据类型时,有提到过“赋值语句”与copy()函数。

其实说到深浅拷贝,需要考虑具体的数据类型。一部分是不可变对象,如数字、字符串;另一部分是可变对象,如列表、字典等。


一、定义解释

  • 变量:一个系统表的元素,指向对象的连接空间。
  • 对象:被分配的一块内存,存储其实际的值。
  • 引用:从变量到对象的指针。
  • 不可变对象:一旦创建就不可以修改,如数字、字符串、元组。
  • 可变对象:可以修改的对象,如列表、字典。
  • 赋值:通过语句“=”实现。左边是新建的变量,右边可以是直接内容,或者已存在的变量。是对象的引用,Python没有拷贝该对象,只是拷贝了对象的引用,新变量指向源变量内存地址。
  • 浅拷贝:对一个对象进行拷贝。拷贝最外围的对象本身,内部的元素都只是拷贝了一个引用而已。即新创建了一个类型跟原对象一样、内容是原对象的引用。【浅拷贝对象是新的,对象的引用内容是旧的。】
    浅拷贝实现的几种方式:(1)切片:[:];(2)工厂函数,比如list()、dict();(3)使用copy()。
  • 深拷贝:外围和内部元素都进行了拷贝对象本身,而不是引用。即把对象复制一遍,并且该对象中引用的其他对象也复制。

二、不可变对象

对于不可变对象,例如数字和字符串而言,赋值(=)、浅拷贝(copy())和深拷贝(deepcopy())没有区别,因为他们的对象引用永远指向同一个内存地址。

通过例子演示:

>>> var_1 = 123>>> id(var_1)            # 通过id()查看地址1615552144>>> var_2 = var_1>>> id(var_2)1615552144>>>>>> import copy        # 浅、深拷贝需要导入copy模块>>> var_3 = copy.copy(var_1)>>> id(var_3)1615552144>>>>>> var_4 = copy.deepcopy(var_1)>>> id(var_4)1615552144

你会发现var_1 ~ var_4 的id指向是一样的。

三、可变对象

对list、dict等数据类型而言,赋值、浅拷贝和深拷贝,他们对内存地址的变化是不同的。

赋值浅拷贝:值相等,地址相等;
copy浅拷贝:值相等,地址不相等;
deepcopy深拷贝:值相等,地址不相等;

例子一:

base[0]=’name’,是一个string,不可变对象;base[1]=[‘age’,18],是list,可变对象。
base_1、base_2均是base的浅拷贝,三者id()一样。
当对第一个string元素进行不同的更改时,发现id各不相同,不会互相影响,因为字符串(不可变)被显示的拷贝,当修改后,新创建了一个字符对象。
而修改第二个list元素时,不同的修改都只对最后一次修改生效,且互相影响,因为第二个元素列表只是简单的复制了其引用,修改任何一个浅拷贝,都会修改引用的内容。
clipboard.png

例子二:深拷贝

创建一个字典对象,并使用深拷贝创建一个新的对象。

>>>import copy>>> var = {"a":1,"b":2,"c":[3,'abc']}>>> var1 = copy.deepcopy(var)>>> id(var),id(var1)(17616992, 15671136)            # 地址不相同>>> id(var['c']),id(var1['c'])(15695144, 15695384)        >>> id(var['c'][0]),id(var1['c'][0])(1615550224, 1615550224)        # ‘c’元素的内存地址是相同的>>>>>> var1['c'][0] = 4>>> var{'a': 1, 'b': 2, 'c': [3, 'abc']}>>> var1{'a': 1, 'b': 2, 'c': [4, 'abc']}>>> id(var['c'][0]),id(var1['c'][0])(1615550224, 1615550240)        # 对var1的修改没有影响var

❤ thanks for watching, keep on updating...

转载地址:http://lwgha.baihongyu.com/

你可能感兴趣的文章
windows与linux ping 显示的ip不一样
查看>>
cPP
查看>>
爬虫的知识点总结
查看>>
利用nginx反向代理,后端Web如何获取客户真实ip
查看>>
Nginx 0.8.x + PHP 5.2.13(FastCGI)搭建胜过Apache十倍的Web服务器(第6版)
查看>>
关于pos系统类型分析
查看>>
NDK官方开发指南翻译之 Toolchain
查看>>
什么是.Net Micro Framework平台移植--初步知识讲解
查看>>
C#.NET通用权限管理在DB2数据库上运行的脚本参考 - 通过程序将数据导入到目标数据库中...
查看>>
第一篇blog,祝我RP++...
查看>>
Linux内核——线程
查看>>
关于delphi点击webbrowser中任意一点的问题
查看>>
Mac安装多个python版本
查看>>
title及alt提示特效
查看>>
Essential Calculate计算控件全面介绍及下载
查看>>
.NET Core程序中使用User Secrets存储敏感数据
查看>>
Python3 解析路径
查看>>
查看端口是否被占用并关掉相应进程
查看>>
mysql5.6主从配置
查看>>
我的友情链接
查看>>