鱼C论坛

 找回密码
 立即注册
查看: 1476|回复: 3

[已解决]遇到一个有关浅复制的疑问

[复制链接]
发表于 2017-3-12 11:50:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
书中定义:浅复制为创建一个新对象,包含的是对原始对象中包含的项的引用。
  1. import copy
  2. 2        a = [1, 2, 3, 4, [5, 6]]
  3. 3        b = copy.copy(a)
  4. 4        b.append(7)
  5. 5        print(a)
  6. 6        print(b)
  7. 7        a[4][1] = -2
  8. 8        print(a)
  9. 9        print(b)
  10. 10        a[2] = -3
  11. 11        print(a)
  12. 12        print(b)


复制代码
使用的是python3.5。第7步和第10步都是赋值,为何第7步改变a值,b值也改变;而第10步a值变化了, 但b值没变。
最佳答案
2017-3-12 13:05:46
本帖最后由 不二如是 于 2017-4-14 07:51 编辑

可以使用 print id(a)来查看a指向的内存地址,当你完成对b赋值后再查看b指向的内存地址,会发现a和b指向的内存地址是不同的,这说明前拷贝会建立新的对象,所以当你对b进行添加元素,b会变而a不会

但是,如果你分别查看a和b中的每一个元素指向的内存地址,会发现id(a[0])=id(b[0]),id(a[1])=id(b[1])...,即b中元素的内存地址与a中元素的内存地址对应相同;同时元素有分可变元素与不可变元素,a=[1,2,3,4,[5,6]]时,a[4]为可变元素,其余为不可变元素,当可变元素发生变化时,它的值虽然变了,但它仍指向原来的内存地址,而不可变元素发生变化时,它会指向新的内存地址,所以当你改变a[4]时,a[4]与b[4]指向内存地址相同,b[4]也变了;而当你改变a[2]时,a[2]指向新的内存地址,b[2]仍指向原来的内存地址,所以b[2]不变

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-3-12 12:38:22 | 显示全部楼层
第七行的赋值是正常的,前拷贝
两个都改变
但是第十行,由于前拷贝
所以 b 不改变
除非使用深拷贝
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-12 13:05:46 | 显示全部楼层    本楼为最佳答案   
本帖最后由 不二如是 于 2017-4-14 07:51 编辑

可以使用 print id(a)来查看a指向的内存地址,当你完成对b赋值后再查看b指向的内存地址,会发现a和b指向的内存地址是不同的,这说明前拷贝会建立新的对象,所以当你对b进行添加元素,b会变而a不会

但是,如果你分别查看a和b中的每一个元素指向的内存地址,会发现id(a[0])=id(b[0]),id(a[1])=id(b[1])...,即b中元素的内存地址与a中元素的内存地址对应相同;同时元素有分可变元素与不可变元素,a=[1,2,3,4,[5,6]]时,a[4]为可变元素,其余为不可变元素,当可变元素发生变化时,它的值虽然变了,但它仍指向原来的内存地址,而不可变元素发生变化时,它会指向新的内存地址,所以当你改变a[4]时,a[4]与b[4]指向内存地址相同,b[4]也变了;而当你改变a[2]时,a[2]指向新的内存地址,b[2]仍指向原来的内存地址,所以b[2]不变

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-12 13:07:33 | 显示全部楼层
http://www.cnblogs.com/wilber2013/p/4645353.html浅复制与深复制链接在这。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 08:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表