直接赋值

赋值是 b = a: 赋值引用,a 和 b 都指向同一个对象,内存地址相同,即a is b。

赋值不是浅拷贝。

  1. >>> a = [1, 2, 3]
  2. >>> b = a
  3. >>> id(a), id(b)
  4. (140579276041800, 140579276041800)
  5. >>> a, b
  6. ([1, 2, 3], [1, 2, 3])
  7. >>> a == b
  8. True
  9. >>> a is b
  10. True
  11. >>> a.append(4)
  12. >>> a, b
  13. ([1, 2, 3, 4], [1, 2, 3, 4])

copy() 浅拷贝:

创建一组拷贝对象的引用。(浅拷贝会创建一个新对象,新对象和原对象指向同一内存地址,但新对象和原对象本身内存地址不同,即值相等,内存地址不等。例:b = copy.copy(a),a==b,但a is not b)

如果原对象的可变对象改变(list),那么新对象随之改变,
如果原对象某位置的不可变对象被替换成其他值,  那么新对象将仍然用原对象的原引用值,不随之改变。

也就是说,因为浅拷贝是拷贝对象的引用,可变对象会随着原对象的改变而改变,不可变对象不变。

PS:切片操作是浅拷贝,会生成一个新的对象( id(新对象) != id(原对象) ),新的对象里保存原对象的引用。

例如:

  1. >>> import copy
  2. >>> l
  3. [100, 2, 3, [2, 3, 4]]
  4. >>> l2 = copy.copy(l)
  5. >>> l2
  6. [100, 2, 3, [2, 3, 4]]
  7. >>> l[0]=-1
  8. >>> l
  9. [-1, 2, 3, [2, 3, 4]]
  10. >>> l2
  11. [100, 2, 3, [2, 3, 4]]
  12. >>> l[-1].append(10000)
  13. >>> l
  14. [-1, 2, 3, [2, 3, 4, 10000]]
  15. >>> l2
  16. [100, 2, 3, [2, 3, 4, 10000]]
  1. >>> a = [1,2,3]
  2. >>> id(a)
  3. 47973832L
  4. >>> id(a[0])
  5. 41902968L
  6. >>> a[0]=5
  7. >>> id(a[0])
  8. 41902872L
  9. >>> id(a)
  10. 47973832L
  11. >>> a
  12. [5, 2, 3]
  13. >>> c = a[:]
  14. >>> id(c[0])
  15. 41902872L
  16. >>> id(a[0])
  17. 41902872L
  18. >>> id(a[1])
  19. 41902944L
  20. >>> id(c[1])
  21. 41902944L
  22. >>> id(c[2])
  23. 41902920L
  24. >>> id(a[2])
  25. 41902920L
  26. >>> a.append(100)
  27. >>> a
  28. [5, 2, 3, 100]
  29. >>> c
  30. [5, 2, 3]
  31. >>> a[0] = -1
  32. >>> id(a[0])
  33. 41903016L
  34. >>> id(c[0]) # a改变了,c仍然引用原对象
  35. 41902872L

  

deepcopy() 深拷贝:

对于原对象,不可变类型使用对象引用,可变类型直接复制一份。无论原对象如何改变,深拷贝出来的对象都不变。

  1. >>> l3 = [1,2,3,"abc",[20,30,40]]
  2. >>> l4 = copy.deepcopy(l3)
  3. >>> l4
  4. [1, 2, 3, 'abc', [20, 30, 40]]
  5. >>> l3[0] = 0
  6. >>> l3
  7. [0, 2, 3, 'abc', [20, 30, 40]]
  8. >>> l4
  9. [1, 2, 3, 'abc', [20, 30, 40]]
  10. >>> l3[-1].append(50)
  11. >>> l3
  12. [0, 2, 3, 'abc', [20, 30, 40, 50]]
  13. >>> l4
  14. [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. 利用Nginx轻松实现Ajax的跨域请求(前后端分离开发调试必备神技)

    利用Nginx轻松实现浏览器中Ajax的跨域请求(前后端分离开发调试必备神技) 前言 为什么会出现跨域? 造成跨域问题的原因是因为浏览器受到同源策略的限制,也就是说js只能访问和操作自己域下的资源,不 ...

  2. 中断描述符表 IDT

    保护模式下三个重要的系统表——GDT.LDT和IDT 这里主要是解释中断描述符表 中断描述符表IDT将每个异常或中断向量分别与它们的处理过程联系起来.与GDT和LDT表类似,IDT也是由8字节长描述符 ...

  3. How To Install Nginx on CentOS 7(转)

    How To Install Nginx on CentOS 7 PostedJuly 22, 2014 427.4kviews NGINX CENTOS About Nginx Nginx is a ...

  4. 给没有id主键的表添加id,并设置为not null 然后填充自增id

    买的ip数据库,表上不带id 使用hibernate比较麻烦,所以直接改表 增加一个字段id,类型int ALTER TABLE t_ip ADD id int; 设置id不为空设置为主键,自增 AL ...

  5. [jnhs]全套CRC校验 算法

    摘自 https://blog.csdn.net/cp1300/article/details/51443350 uint8_t crc4_itu(uint8_t *data, uint_len le ...

  6. 为啥Spring和Spring MVC包扫描要分开

    开始学习springmvc各种小白问题 根据例子配置了spring扫描包,但是一直提示404错误,经过大量搜索,发现,扫描包的配置应该写在springmvc的配置文件中,而不是springmvc 配置 ...

  7. 【NOJ2024】入栈序列和出栈序列

    入栈序列和出栈序列 时间限制(普通/Java):1000MS/3000MS         运行内存限制:65536KByte 总提交:293          测试通过:68 比赛描述 给出入栈序列 ...

  8. 高可用服务 AHAS 在消息队列 MQ 削峰填谷场景下的应用

    在消息队列中,当消费者去消费消息的时候,无论是通过 pull 的方式还是 push 的方式,都可能会出现大批量的消息突刺.如果此时要处理所有消息,很可能会导致系统负载过高,影响稳定性.但其实可能后面几 ...

  9. Vue--公有组件以及组件的使用和特点

    组件的作用:为了能够让功能与功能之间互不影响,使代码更加清晰整洁 1 <!DOCTYPE html> <html lang="en"> <head&g ...

  10. 【Mobius绮丽的辗转】莫比乌斯反演

    Problem 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. 1≤n≤50000,1≤a≤b≤5 ...