Python copy(), deepcopy()
直接赋值
赋值是 b = a: 赋值引用,a 和 b 都指向同一个对象,内存地址相同,即a is b。
赋值不是浅拷贝。
>>> a = [1, 2, 3]
>>> b = a
>>> id(a), id(b)
(140579276041800, 140579276041800)
>>> a, b
([1, 2, 3], [1, 2, 3])
>>> a == b
True
>>> a is b
True
>>> a.append(4)
>>> a, b
([1, 2, 3, 4], [1, 2, 3, 4])
copy() 浅拷贝:
创建一组拷贝对象的引用。(浅拷贝会创建一个新对象,新对象和原对象指向同一内存地址,但新对象和原对象本身内存地址不同,即值相等,内存地址不等。例:b = copy.copy(a),a==b,但a is not b)
如果原对象的可变对象改变(list),那么新对象随之改变,
如果原对象某位置的不可变对象被替换成其他值, 那么新对象将仍然用原对象的原引用值,不随之改变。
也就是说,因为浅拷贝是拷贝对象的引用,可变对象会随着原对象的改变而改变,不可变对象不变。
PS:切片操作是浅拷贝,会生成一个新的对象( id(新对象) != id(原对象) ),新的对象里保存原对象的引用。
例如:
>>> import copy
>>> l
[100, 2, 3, [2, 3, 4]]
>>> l2 = copy.copy(l)
>>> l2
[100, 2, 3, [2, 3, 4]]
>>> l[0]=-1
>>> l
[-1, 2, 3, [2, 3, 4]]
>>> l2
[100, 2, 3, [2, 3, 4]]
>>> l[-1].append(10000)
>>> l
[-1, 2, 3, [2, 3, 4, 10000]]
>>> l2
[100, 2, 3, [2, 3, 4, 10000]]
>>> a = [1,2,3]
>>> id(a)
47973832L
>>> id(a[0])
41902968L
>>> a[0]=5
>>> id(a[0])
41902872L
>>> id(a)
47973832L
>>> a
[5, 2, 3]
>>> c = a[:]
>>> id(c[0])
41902872L
>>> id(a[0])
41902872L
>>> id(a[1])
41902944L
>>> id(c[1])
41902944L
>>> id(c[2])
41902920L
>>> id(a[2])
41902920L
>>> a.append(100)
>>> a
[5, 2, 3, 100]
>>> c
[5, 2, 3]
>>> a[0] = -1
>>> id(a[0])
41903016L
>>> id(c[0]) # a改变了,c仍然引用原对象
41902872L
deepcopy() 深拷贝:
对于原对象,不可变类型使用对象引用,可变类型直接复制一份。无论原对象如何改变,深拷贝出来的对象都不变。
>>> l3 = [1,2,3,"abc",[20,30,40]]
>>> l4 = copy.deepcopy(l3)
>>> l4
[1, 2, 3, 'abc', [20, 30, 40]]
>>> l3[0] = 0
>>> l3
[0, 2, 3, 'abc', [20, 30, 40]]
>>> l4
[1, 2, 3, 'abc', [20, 30, 40]]
>>> l3[-1].append(50)
>>> l3
[0, 2, 3, 'abc', [20, 30, 40, 50]]
>>> l4
[1, 2, 3, 'abc', [20, 30, 40]]
Python copy(), deepcopy()的更多相关文章
- Python copy and deepcopy
Python中的对象之间赋值时是按引用传递的,如果需要拷贝对象,需要使用标准库中的copy模块. 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deep ...
- Python copy对象(copy与deepcopy)
Python中的对象之间赋值时是按引用传递的,如果需要拷贝对象,需要使用标准库中的copy模块. 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deep ...
- Python 浅拷贝copy()与深拷贝copy.deepcopy()
首先我在这介绍两个新的小知识,要在下面用到.一个是函数 id() ,另一个是运算符 is.id() 函数就是返回对象的内存地址:is 是比较两个变量的对象引用是否指向同一个对象,在这里请不要和 == ...
- Python 函数参数引用(传值/传址)/copy/deepcopy
精简版: 传值:被调函数局部变量改变不会影响主调函数局部变量 传址:被调函数局部变量改变会影响主调函数局部变量 Python参数传递方式:传递对象引用(传值和传址的混合方式),如果是数字,字符串,元组 ...
- Python 传值和传址 copy/deepcopy
传值:被调函数局部变量改变不会影响主调函数局部变量 传址:被调函数局部变量改变会影响主调函数局部变量 Python参数传递方式:传递对象引用(传值和传址的混合方式),如果是数字,字符串,元组则传值:如 ...
- python copy和deepcopy
Python FAQ2:赋值.浅拷贝.深拷贝的区别? 发表于 2014-08-15 | 分类于 Lang.-Python | 在写Python过程中,经常会遇到对象的拷贝,如果不理解浅拷 ...
- [Python] 等号赋值, copy, deepcopy的区别
参考链接: 1. 介绍python中的可变类型与不可变类型:https://blog.csdn.net/answer3lin/article/details/86430074 (也可以参考转载博客 P ...
- python copy与deepcopy (拷贝与深拷贝)
copy与deepcopy python 中的copy与deepcopy是内存数据的操作,但是两个函数有一定的区别. 1.copy import copy list = [1, [4, 5, 6], ...
- Python面试题之copy/deepcopy详解
copy和deepcopy有什么区别? http://blog.csdn.net/qq_32907349/article/details/52190796 http://iaman.actor/blo ...
随机推荐
- Hibernate中的Query
//1:创建query对象,方法里面写hql语句 Query query = session.createQuery("from User"); //2:利用query对象中的方法 ...
- netbeans性能分析文件保存位置
C:\Users\Administrator\AppData\Roaming\NetBeans\8.2\config\HTTPMonitor 分析完,记得把文件删除,不然系统盘要满了
- E浏览器常见的9个css Bug以及解决办法
我们在浏览网页的时候经常看见这样的现象:某个网页在IE6浏览器中打开很正常,但是在IE8里面打开可能完全变形了.或者也有可能出现完全相反的现象.这让Web程序员及设计师往往为了其CSS在各个IE版本下 ...
- Django ORM中的查询,删除,更新操作
ORM查询操作 修改views.py文件 from django.shortcuts import render, HttpResponse from app01 import models from ...
- centos 安装nginx + 多个tomcat负载均衡
今天在centos上安装了两个tomcat和nginx,进行配置.今天记录的只是最基本的实现测试.(不包含使用redis进行session共享) Nginx 是一款轻量级的Web 服务器/反向代理服务 ...
- 洛谷P1855 榨取kkksc03 [2017年4月计划 动态规划 09]
P1855 榨取kkksc03 题目描述 洛谷的运营组决定,如果一名oier向他的教练推荐洛谷,并能够成功的使用(成功使用的定义是:该团队有20个或以上的成员,上传10道以上的私有题目,布置过一次作业 ...
- 根据一个分类id 获取这个分类底下所有子分类的商品信息,根据下面方法查询出所有有关分类id 再 根据这些id去商品表里查询所有商品信息
/** * 检测该分类下所有子分类,并输出ID(包括自己) * 数据库字段 catid pid */ function getChildrenIds ($sort_id){ include_once ...
- web前端学习(四)JavaScript学习笔记部分(1)-- JavaScript基础教程
1.JavaScript基础教程 1.1.Javascript基础-介绍.实现.输出 1.1.1.JavaScript是互联网上最流行的脚本语言,这门语言可用于web和HTML,更可广泛用于服务端.p ...
- Codeforces 356A
这题有个注意的地方,就是对集合边读边删除的时候,应该尤为注意.. my_set.erase(it++) #include <iostream> #include <cstring ...
- Linux 配置yum源(互联网)
Linux 配置yum源(互联网) 环境:操作系统Redhat 7.5 1.卸载现有的yum源 rpm -qa|grep yum|xargs rpm -e --nodeps #移除与原yum有 ...