直接赋值

赋值是 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()的更多相关文章

  1. Python copy and deepcopy

    Python中的对象之间赋值时是按引用传递的,如果需要拷贝对象,需要使用标准库中的copy模块. 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deep ...

  2. Python copy对象(copy与deepcopy)

    Python中的对象之间赋值时是按引用传递的,如果需要拷贝对象,需要使用标准库中的copy模块. 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deep ...

  3. Python 浅拷贝copy()与深拷贝copy.deepcopy()

    首先我在这介绍两个新的小知识,要在下面用到.一个是函数 id() ,另一个是运算符 is.id() 函数就是返回对象的内存地址:is 是比较两个变量的对象引用是否指向同一个对象,在这里请不要和 == ...

  4. Python 函数参数引用(传值/传址)/copy/deepcopy

    精简版: 传值:被调函数局部变量改变不会影响主调函数局部变量 传址:被调函数局部变量改变会影响主调函数局部变量 Python参数传递方式:传递对象引用(传值和传址的混合方式),如果是数字,字符串,元组 ...

  5. Python 传值和传址 copy/deepcopy

    传值:被调函数局部变量改变不会影响主调函数局部变量 传址:被调函数局部变量改变会影响主调函数局部变量 Python参数传递方式:传递对象引用(传值和传址的混合方式),如果是数字,字符串,元组则传值:如 ...

  6. python copy和deepcopy

    Python FAQ2:赋值.浅拷贝.深拷贝的区别? 发表于 2014-08-15   |   分类于 Lang.-Python  |   在写Python过程中,经常会遇到对象的拷贝,如果不理解浅拷 ...

  7. [Python] 等号赋值, copy, deepcopy的区别

    参考链接: 1. 介绍python中的可变类型与不可变类型:https://blog.csdn.net/answer3lin/article/details/86430074 (也可以参考转载博客 P ...

  8. python copy与deepcopy (拷贝与深拷贝)

    copy与deepcopy python 中的copy与deepcopy是内存数据的操作,但是两个函数有一定的区别. 1.copy import copy list = [1, [4, 5, 6], ...

  9. Python面试题之copy/deepcopy详解

    copy和deepcopy有什么区别? http://blog.csdn.net/qq_32907349/article/details/52190796 http://iaman.actor/blo ...

随机推荐

  1. Centos 设置时区

    参考网址: http://jingyan.baidu.com/article/636f38bb268a82d6b84610bd.html //打开设置 tzselect //选择 )Asia → )c ...

  2. android的AIDL

    一.AIDL的意义:           AIDL全称是Android Interface Definition Language,是android接口定义语言.AIDL就是为了避免我们一遍遍的写一些 ...

  3. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---门面模式之HomeTheater[转]

      1unit uSubObject;   2   3interface   4   5type   6   7  { TAmplifier与TTuner,TCDPlayer,TDVDPlayer相互 ...

  4. mybatis深入理解(三)-----MyBatis事务管理机制

    MyBatis作为Java语言的数据库框架,对数据库的事务管理是其非常重要的一个方面.本文将讲述MyBatis的事务管理的实现机制.首先介绍MyBatis的事务Transaction的接口设计以及其不 ...

  5. 话说placeholder

    placeholder 属性提供一种提示(hint),描述输入域所期待的值. 注释:placeholder 属性适用于以下类型的 <input> 标签:text, search, url, ...

  6. Jboss 默认加载项目访问

    修改JBOSS的server.xml路径为: D:\Program Files\jboss-4.2.2.GA\server\default\deploy\jboss-web.deployer\serv ...

  7. python学生管理系统

    import osimport re #获取本机用户名,构建student.txt文件名创建在左面import getpassusername=getpass.getuser()print(" ...

  8. day 53

    目录 orm表关系如何建立 django中间件 路由层 反向解析 路由分发 名称空间 伪静态 虚拟环境 django版本的区别 视图层 orm表关系如何建立 ​ 多对多 ​ 一对多 ​ 一对一 ​ 换 ...

  9. neo4j遍历和图算法

    阅读更多 这篇blog主要和大家分享一下neo4j中是如何对节点进行遍历,和其中集成的图论的一些常用算法. 遍历 http://docs.neo4j.org.cn/tutorials-java-emb ...

  10. NoSQL最新现状和趋势:云NoSQL数据库将成重要增长引擎

    NoSQL最早起源于1998年,但从2009年开始,NoSQL真正开始逐渐兴起和发展.回望历史应该说NoSQL数据库的兴起,完全是十年来伴随互联网技术,大数据数据的兴起和发展,NoSQL在面临大数据场 ...