Python 赋值、浅拷贝和深拷贝
初学Python,和C++还是有许多不同。直接赋值、浅拷贝和深拷贝,这三种拷贝对象的操作之间还是有许多的区别。Python语言的版本为2.7,在Pycharm中进行实验。
一、直接赋值
用下面的代码来实验:
origin = [1, "string", [1, 3, 5]]
Copy = origin
print Copy
print id(origin), id(Copy)
Copy[0] = 5
print origin, Copy
Copy[1] = "changed"
print origin, Copy
Copy[2][0] = 111
print origin, Copy
print id(origin), id(Copy)
运行的结果如下:
[1, 'string', [1, 3, 5]]
38994824 38994824
[5, 'string', [1, 3, 5]] [5, 'string', [1, 3, 5]]
[5, 'changed', [1, 3, 5]] [5, 'changed', [1, 3, 5]]
[5, 'changed', [111, 3, 5]] [5, 'changed', [111, 3, 5]]
38994824 38994824
可见,直接赋值的新变量完完全全就是一个原对象的引用,任何对复制对象的引用都会影响到原对象。
二、浅拷贝
用相同的代码来测试,仅仅把拷贝方式改成了copy.copy():
import copy
origin = [1, "string", [1, 3, 5]]
Copy = copy.copy(origin)
print Copy
print id(origin), id(Copy)
Copy[0] = 5
print origin, Copy
Copy[1] = "changed"
print origin, Copy
Copy[2][0] = 111
print origin, Copy
print id(origin), id(Copy)
运行的结果如下:
[1, 'string', [1, 3, 5]]
39453768 39510280
[1, 'string', [1, 3, 5]] [5, 'string', [1, 3, 5]]
[1, 'string', [1, 3, 5]] [5, 'changed', [1, 3, 5]]
[1, 'string', [111, 3, 5]] [5, 'changed', [111, 3, 5]]
39453768 39510280
这次可以发现,两个对象指向的内存并不相同,也就是说,浅拷贝的对象是一个新的对象。另外,可以发现,对新对象的元素进行替换并不会影响到原对象,而对子对象——列表的修改会影响到原对象。
三、深拷贝
同样,只是把拷贝方式换成copy.deepcopy():
import copy
origin = [1, "string", [1, 3, 5]]
Copy = copy.deepcopy(origin)
print Copy
print id(origin), id(Copy)
Copy[0] = 5
print origin, Copy
Copy[1] = "changed"
print origin, Copy
Copy[2][0] = 111
print origin, Copy
print id(origin), id(Copy)
结果如下:
[1, 'string', [1, 3, 5]]
39978056 39994504
[1, 'string', [1, 3, 5]] [5, 'string', [1, 3, 5]]
[1, 'string', [1, 3, 5]] [5, 'changed', [1, 3, 5]]
[1, 'string', [1, 3, 5]] [5, 'changed', [111, 3, 5]]
39978056 39994504
同样,两个对象指向的内存位置并不相同,说明创建了新对象。此外,新对象的任何改动都不影响到原有的对象。
结论:
(1)直接赋值是一个完完全全的引用,对新变量的任何改动都会影响到原对象。
(2)浅拷贝创建了新的对象,但是只拷贝了序列的元素,对于元素也是一个序列的情况(即子对象),只复制了对这个序列的引用!
(3)深拷贝是完完全全的拷贝,把原对象完整地拷贝到了新对象中。
Python 赋值、浅拷贝和深拷贝的更多相关文章
- 对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解
引用:https://www.jb51.net/article/142775.htm 列表赋值: 1 2 3 4 5 6 7 >>> a = [1, 2, 3] >>&g ...
- 深度解析:python之浅拷贝与深拷贝
深度解析python之浅拷贝与深拷贝 本文包括知识点: 1.copy与deepcopy 2.可变类型与不可变类型 1.copy与deepcopy 在日常python编码过程中,经常会遇见变量的赋值.这 ...
- python的浅拷贝和深拷贝
python对象有两种拷贝的形式:浅拷贝和深拷贝. 在<python核心编程>中看到对这两种拷贝的分析,觉得十分收益,所以记录在此. id()方法:id()方法可以查看某个对象的ID,类似 ...
- python:浅拷贝与深拷贝
1,“相等”与“相同” 我们先赋值三个变量a, b, c: a = [1, 2, [1, 2]] b = [1, 2, [1, 2]] c = a 判断一下‘相等’: a == b 返回 True ...
- python之浅拷贝和深拷贝
1.浅拷贝 1>赋值:从下面的例子我们可以看到赋值之后新变量的内存地址并没有发生任何变化,实际上python中的赋值操作不会开辟新的内存空间,它只是复制了新对象的引用,也就是说除了b这个名字以外 ...
- Python的浅拷贝与深拷贝
定义: =号浅拷贝:在Python中对象的赋值其实就是对象的引用.copy了之后两个仍然是同一个东西.那么他们内部的元素自然也是一样的,对其中一个进行修改,另一个也会跟着变> copy()浅拷贝 ...
- python中浅拷贝和深拷贝分析
首先,我们知道Python3中,有6个标准的数据类型,他们又分为可以变和不可变.不可变:Number(数字).String(字符串).Tuple(元组).可以变:List(列表).Dictionary ...
- python中浅拷贝和深拷贝的区别
浅拷贝 可变类型浅拷贝copy函数就是浅拷贝,只对可变类型的第一层对象进行拷贝,对拷贝的对象开辟新的内存空间进行存储,不会拷贝对象内部的子对象可变类型:a = [1, 2, 3] b = [11, 2 ...
- Python 列表浅拷贝与深拷贝
浅拷贝 shallow copy 和深拷贝 deep copy list.copy() 浅拷贝:复制此列表(只复制一层,不会复制深层对象) 等同于 L[:] 举例: 浅拷贝: a = [1.1, 2. ...
- Python中浅拷贝和深拷贝的区别总结与理解
单层浅拷贝 import copy a = 1 # 不可变数据类型 copy_a = copy.copy(a) print(id(a),id(copy_a)) # 内存地址相同 a = [1,2] # ...
随机推荐
- 发布ios应用程序
详见文档 AppDistributionGuide Submit and Release Your App 首先,需要登入itunes connect并且输入必要的信息更改app状态为 waiting ...
- Python机器学习-分类
监督学习下的分类模型,主要运用sklearn实践 kNN分类器 决策树 朴素贝叶斯 实战一:预测股市涨跌 # -*- coding: utf-8 -*- """ Crea ...
- Cocos2d-x游戏《雷电大战》开源啦!要源代码要资源快快来~~
写在前面的话:这是笔者开发的第二个小游戏<雷电大战>,之前就过这个游戏和<赵云要格斗>一样,终于将会开源. 因为自己的一些个人原因. 这个游戏还没有完毕.可是很多网友都过来寻求 ...
- Hadoop教程(一)
英文原文:cloudera,编译:ImportNew – Royce Wong Hadoop从这里开始!和我一起学习下使用Hadoop的基本知识,下文将以Hadoop Tutorial为主体带大家走一 ...
- HTML URL编码规则
将空格转换为加号(+) 对0-9,a-z,A-Z之间的字符保持不变 对于所有其他的字符,用这个字符的当前字符集编码在内存中的十六进制格式表示,并在每个字节前加上一个百分号(%).如字符“+”用%2B表 ...
- C#语言循环语句for嵌套
- PHP生成excel(3)
这一节主要是设置背景颜色.边框.字体大小.表格宽度 效果图 代码如下 <?php header("Content-Type:text/html;charset=utf-8") ...
- MergeLinklist
写了一个合并有序链表,代码有点纠结啊.涉及到指针就是麻烦,DS课曹老师课件说linklist是DS的难点. . . 假设数组就非常easy了.链表就要小心. 里面遇到的一些情况.第一.最好是先确定l1 ...
- 项目记录26--unity-tolua框架 View03-UIManager.lua
做为程序员要懂得假设保持健康,对电脑时间太长非常easy眼花,得脖子病,腰都疼,这星期六日组团到康宁去了,哈哈. 一个字"疼"!!!! 废话不多少,把UIManager.lua个搞 ...
- 使用dataguard将单实例数据库转换为rac数据库
我们常常将oracle rac数据库通过dataguard容灾到一个单实例数据库中.当生产库出现问题后能够将生产库切换到dgserver上.而当生产库rac修复完毕后.我们相同能够通过dg将数据回切到 ...