找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 3811|回复: 4

[已解决] b=a,a和b元素共享的一个问题。帮忙解答下

5

主题

10

帖子

10

积分

贫民

积分
10
井陉小张 发表于 2016-12-7 19:07:22 | 显示全部楼层 |阅读模式
>>> a=[1,2,[3,4]]
>>> b=list(a)
>>> b[2][0]=-100
>>> b
[1, 2, [-100, 4]]
>>> a
[1, 2, [-100, 4]]         #为什么这里修改了b列表中的值,a也就改变了。书上说是元素是共享的。
>>> b[1]=100
>>> b
[1, 100, [-100, 4]]
>>> a
[1, 2, [-100, 4]]        #既然是共享的,那为什么改变了b[1],a确没有改变呢???
>>>

回复

使用道具 举报

0

主题

27

帖子

27

积分

贫民

积分
27
maximal_ideal 发表于 2016-12-7 21:17:36 | 显示全部楼层

    下面几行是关于深浅拷贝的话,显然b是a的浅拷贝 内部的嵌套都是引用,只有一级目录是拷贝

    深浅拷贝都是对源对象的复制,占用不同的内存空间
    如果源对象只有一级目录的话,源做任何改动,不影响深浅拷贝对象
    如果源对象不止一级目录的话,源做任何改动,都要影响浅拷贝,但不影响深拷贝
    序列对象的切片其实是浅拷贝,即只拷贝顶级的对象
回复 支持 1 反对 0

使用道具 举报

1419

主题

1891

帖子

291

积分

侠客

积分
291

最佳新人热心会员默默耕耘

whydo1 发表于 2016-12-7 20:19:52 | 显示全部楼层
这应该是深浅复制的问题。
用下面代码
import copy
b=copy.deepcopy(a)
可以避免这个问题
python3.4.4, win10
回复 支持 反对

使用道具 举报

0

主题

27

帖子

27

积分

贫民

积分
27
maximal_ideal 发表于 2016-12-7 20:54:10 | 显示全部楼层
我想是因为你用的b = list(a)
如果 b = a 那么b和a是指向同一个
回复 支持 反对

使用道具 举报

5

主题

12

帖子

12

积分

贫民

积分
12
TheSkyyy 发表于 2016-12-11 15:31:24 | 显示全部楼层
你用a = b来进行复制的话 并不会创建一个新的b,而是把b指向a的内存,所以改b,a也变。
大概是这样:
a --> [1,2,3,4,[1,2](假设内存地址为:XXX)
b =a
b--> [1,2,3,4,[1,2](内存地址为:XXX)
-----------------------------------------
如果要想实现题主的想法可以用切片:
b = a[:]  #复制整个列表,可以算是深度复制
回复 支持 反对

使用道具 举报

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

本版积分规则

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