Python赋值语句与深拷贝、浅拷贝的区别
- 正常赋值语句会使左操作数简单地指向右操作数指向的对象。
深拷贝和浅拷贝之间的区别仅对复合变量起作用,复合变量指的是对象中又包含了对象,如list,class,dict。
- 一次浅拷贝会构造一个新的复合对象,然后将原始对象中的所有引用插入到新的复合对象中。
- 一次深拷贝也会构造一个新的复合对象,但会递归地将原始对象中的所有对象拷贝一份到新的复合对象中。
对于非复合变量, 赋值语句,深拷贝,浅拷贝都实现的是赋值语句功能。
例子:
import copy
a = [1, 2, 3]
d = [4, 5, 6]
c = [a, b]
如果使用正常赋值语句:
d = c
print id(c) == id(d) # True - d和c指向同一个对象
print id(c[0]) == id(d[0]) # True - d[0]和c[0]当然也是同一对象
使用浅拷贝的话:
d = copy.copy(c)
print id(c) == id(d) # False - d是一个新对象,浅拷贝会构造一个新的复合对象
print id(c[0]) == id(d[0]) # True - 但复合对象中的对象不会复制,和原来的指向一样
使用深拷贝的话:
d = copy.deepcopy(c)
print id(c) == id(d) # False - d同一是个全新的复合对象
print id(c[0]) == id(d[0]) # False - 复合对象中对象也同样进行拷贝
Python赋值语句与深拷贝、浅拷贝的区别的更多相关文章
- Python 深拷贝和浅拷贝的区别
python的复制,深拷贝和浅拷贝的区别 在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用 ...
- Python深复制浅复制or深拷贝浅拷贝
1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象.(比深拷贝更加节省内存)2. copy.deepcopy 深拷贝 拷贝对象及其子对象 用一个简单的例子说明如下: >& ...
- python中的深拷贝和浅拷贝
python的复制,深拷贝和浅拷贝的区别 在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用 一 ...
- **Python中的深拷贝和浅拷贝详解
Python中的深拷贝和浅拷贝详解 这篇文章主要介绍了Python中的深拷贝和浅拷贝详解,本文讲解了变量-对象-引用.可变对象-不可变对象.拷贝等内容. 要说清楚Python中的深浅拷贝,需要 ...
- 【04】Python 深拷贝浅拷贝 函数 递归 集合
1 深拷贝浅拷贝 1.1 a==b与a is b的区别 a == b 比较两个对象的内容是否相等(可以是不同内存空间) a is b 比较a与b是否指向同一个内存地址,也就是a与b的id是否相 ...
- 一入python深似海--浅拷贝与深拷贝
python中有一个模块copy,deepcopy函数用于深拷贝,copy函数用于浅拷贝. 要理解浅拷贝,必须先弄清楚python中的引用. 引用 Python中一切都是对象,变量中存放的是对象的引用 ...
- python直接赋值,浅拷贝和深拷贝
本文参考自<Python 直接赋值.浅拷贝和深度拷贝解析> 定义 直接赋值:就是对象的引用(别名) 浅拷贝(copy):拷贝父对象,不拷贝对象内部的子对象 深拷贝(deepcopy):co ...
- Python 直接赋值、浅拷贝和深度拷贝区别
Python 直接赋值.浅拷贝和深度拷贝区别 转自https://www.runoob.com/w3cnote/python-understanding-dict-copy-shallow-or-de ...
- python集合增删改查,深拷贝浅拷贝
集合 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. 关系 ...
随机推荐
- PHP连接MySQL的时候报错SQLSTATE[HY000] [2002] No such file or directory
错误环境:Mac OS 10.10 找到mysql.sock文件的位置 $sudo find / -name mysql.sock ------结果如下---------- find: /dev/fd ...
- Linux Shell脚本实现根据进程名杀死进程
Shell脚本源码如下: #!/bin/sh #根据进程名杀死进程 if [ $# -lt 1 ] then echo "缺少参数:procedure_name" exit 1 f ...
- c++ 11 sleep()
#include<chrono>#include<thread> std::this_thread::sleep_for(std::chrono::milliseconds(1 ...
- web前端之性能优化
作为一个前端工作人员,而且只会写点HTML5和CSS3的“假”前端工程师,为了能更好地理解一下前端的花花世界,最近拜读了<高性能网站建设指南>一书,对作者提出的前端性能优化的14个规则获益 ...
- ngx.lua中遇到的小问题2
用lua+drizzle在数据库中插入数据失败(不能访问数据库) 后面发现原来是nginx配置文件中的drizzle模块部分最后多了一行 content_by_lua 'ngx.say(" ...
- 循序渐进Python3(十一) --3-- web之dom
DOM 文档对象模型(Document Object Model,DOM)是一种用于HTML和XML文档的编程接口.它给文档提供了一种结构化的表示方法,可以改变文档的 ...
- Linux下MySQL数据库常用基本操作 一
1.显示数据库 show databases; 2.选择数据库 use 数据库名; 3.显示数据库中的表 show tables; 4.显示数据表的结构 describe 表名; 5.显示表中记录 S ...
- CoreSeek
[CoreSeek] CoreSeek有两个核心模块Indexer和Search. Indexer:负责从MySQL拉取数据源,把数据源分词,建立索引. Search:搜索模块. CoreSeek工作 ...
- Oracle 添加字段,并自增
第一步:alter table TOWN add ID int 第二步:Update TOWN set id=rownum; Commit;
- jquery动态删除html代码
1.remove() remove()方法移除被选元素,包括所有的文本和子节点. 语法:$(selector).remove() 当我们想将元素自身移除时我们用 .remove(),同时也会移除元素内 ...