Python 中的浅拷贝和深拷贝
1. 列表和字典,直接赋值,都是浅拷贝,即赋值双方指向同一地址,因为 Python 对可变对象按引用传递。
>>> a = [1, 2, 3]
>>> b = a
>>> b
[1, 2, 3]
>>> a[0] = 'apple'
>>> a
['apple', 2, 3]
>>> b
['apple', 2, 3]
>>>
>>>
>>> dic = {'a': 'apple', 'b': 'banbana'}
>>> dic2 = dic
>>> dic2
{'a': 'apple', 'b': 'banbana'}
>>> dic['b'] = 'blueberry'
>>> dic
{'a': 'apple', 'b': 'blueberry'}
>>> dic2
{'a': 'apple', 'b': 'blueberry'}
2. 对非嵌套的列表,使用完全切片[:], 工厂函数 list(),或者 copy.copy() 都是深拷贝。
>>> a = [1, 2, 3]
>>> b = list(a)
>>> c = a[:]
>>> import copy
>>> d = copy.copy(a)
>>>
>>> a[0] = 'apple'
>>> a
['apple', 2, 3]
>>> b
[1, 2, 3]
>>> c
[1, 2, 3]
>>> d
[1, 2, 3]
3. 对于非嵌套的字典,使用工厂函数 dict(),或者 copy.copy() 都是深拷贝。
>>> dic = {'a': 'apple', 'b': 'banana'}
>>> dic2 = dict(dic)
>>> import copy
>>> dic3 = copy.copy(dic)
>>>
>>> dic['b'] = 'blueberry'
>>> dic
{'a': 'apple', 'b': 'blueberry'}
>>> dic2
{'a': 'apple', 'b': 'banana'}
>>> dic3
{'a': 'apple', 'b': 'banana'}
4. 对于嵌套的列表,嵌套的字典,只能使用 copy.deepcopy() 实现深拷贝。
>>> import copy
>>>
>>> a = [1, 2, ['apple']]
>>> b = copy.deepcopy(a)
>>> a[2][0] = 'watermelon'
>>> a
[1, 2, ['watermelon']]
>>> b
[1, 2, ['apple']]
>>>
>>>
>>> dic = {'a': 'apple', 'b': {'b1': 'banana', 'b2': 'blueberry'}}
>>> dic2 = copy.deepcopy(dic)
>>> dic['b']['b1'] = 'bukeneng'
>>> dic
{'a': 'apple', 'b': {'b1': 'bukeneng', 'b2': 'blueberry'}}
>>> dic2
{'a': 'apple', 'b': {'b1': 'banana', 'b2': 'blueberry'}}
5. 对于嵌套可变对象的元组,只有 copy.deepcopy() 实现深拷贝。
>>> import copy
>>>
>>> t = (1, 2, ['apple'])
>>> t2 = t
>>> t3 = tuple(t)
>>> t4 = copy.copy(t)
>>> t5 = copy.deepcopy(t)
>>>
>>> t[2][0] = 'watermelon'
>>> t
(1, 2, ['watermelon'])
>>> t2
(1, 2, ['watermelon'])
>>> t3
(1, 2, ['watermelon'])
>>> t4
(1, 2, ['watermelon'])
>>> t5
(1, 2, ['apple'])
完。
Python 中的浅拷贝和深拷贝的更多相关文章
- python中的浅拷贝,深拷贝
直接引用,间接引用 # 1.列表存储的是索引对应值的内存地址,值会单独的开辟一个内存空间 list = ["a","b"] 内存里面存储的就是list[0],l ...
- python中的浅拷贝和深拷贝
1.赋值语句 a = 'abc' b = a print id(a) print id(b) # id(a):29283464 # id(b):29283464 通过简单的复制,我们可以看到,a b其 ...
- 16.python中的浅拷贝和深拷贝
在讲什么是深浅拷贝之前,我们先来看这样一个现象: a = ['scolia', 123, [], ] b = a[:] b[2].append(666) print a print b
- Python中的浅拷贝与深拷贝
编者注:本文主要参考了<Python核心编程(第二版)> 以下都是参考资料后,我自己的理解,如有错误希望大家不吝赐教. 大家有没有遇到这样一种情况,对象赋值后,对其中一个变量进行修改,另外 ...
- (转+原)python中的浅拷贝和深拷贝
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6069722.html 原网址: http://blog.csdn.net/sunshine_in_mo ...
- Python中的赋值、深拷贝与浅拷贝(内存地址)
Python中的赋值.深拷贝与浅拷贝(内存地址) 1.python中的可变对象与不可变对象 (1) 可变对象:dict,list def dict_test(): a = {} b = a print ...
- 【转】JAVA中的浅拷贝和深拷贝
原文网址:http://blog.bd17kaka.net/blog/2013/06/25/java-deep-copy/ JAVA中的浅拷贝和深拷贝(shallow copy and deep co ...
- python中的浅拷贝与赋值不同
Python中的对象之间赋值时是按引用传递的,如果需要拷贝对象,需要使用标准库中的copy模块. 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deep ...
- Python 引用、浅拷贝、深拷贝解析
引用 Python是动态数据类型的语言,故在对变量进行赋值时是不用制定变量类型的. 或者说,你可以把变量赋值的过程,当作是贴一个标签,去引用该数据. 看下面的例子: In [54]: a=4 In [ ...
随机推荐
- SpringBoot设置文件上传大小限制--默认为1M
SpringBoot默认上传文件大小不能超过1MB,超过之后会报以下异常:org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeL ...
- POJ 2484 A Funny Game(智商博弈)
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6397 Accepted: 3978 Description Alice ...
- Mycat 中间件配置初探与入门操作
Mycat中间件配置初探与入门操作 By:授客 QQ:1033553122 实践环境 Mycat-server-1.5.1-RELEASE-20161130213509-win.tar.gz 下载地址 ...
- 从头开始:详解MVVM、MVVMLight
究竟为什么要学习MVVM? 相信大部分同学在刚开始接触MVVM的时候(包括我自己),心里默默在想这究竟是什么玩意?一个简单的功能要写一大段代码才能完成,在看到MVVM的核心目标: 1.让UI界面与逻辑 ...
- (python)面向对象
一.面向对象概述 要了解面向对象,就需要先了解面向过程的概念,那么什么是面向过程编程呢?最具代表性的就是C语言了,所谓面向过程编程就是在做一件事的时候,需要按步骤进行,第一步干什么,第二步干什么,这种 ...
- ERROR 1044 (42000): Access denied for user 'root'@'localhost'
从供应商那边接手一个MySQL数据库(数据库版本为5.7.21 MySQL Community Server (GPL)),在创建账号时遇到了"ERROR 1044 (42000): Acc ...
- 排序算法----快速排序java
快速排序是对冒泡排序的一种改进,平均时间复杂度是O(nlogn) import java.util.Arrays; import java.util.Scanner; public class tes ...
- 想起以前写的一个爬虫,然后就用C#WinForm写了一个下载小说的软件,比较简单
本软件本是练习.讨论爬虫技术所用.如果侵犯了您的利益请联系我,我会立即删除! 小工具安装包: 百度网盘链接:https://pan.baidu.com/s/1m_OuEBOEE47kYaXq5fwpI ...
- Sql查询今天、本周和本月的记录(时间字段为时间戳)
工作中遇到的问题,小结一下 查询今日添加的记录: select * from [表名] where datediff(day,CONVERT(VARCHAR(20),DATEADD(SECOND,[时 ...
- Docker详细介绍安装与镜像制作和拉取
一.Docker是什么? 产生背景: 开发和运维之间因为环境不同和导致的矛盾(不同的操作系统.软件环境.应用配置等)DevOps 代码.系统.环境.配置等封装成镜像Image--->运维: 集群 ...