python 小白,碰到一个坑,求助

2015-04-29 14:34:45 +08:00
 zgoing

问题简化一下,是这样的

a = []
b = []
for i in range(10):
    b.append(i)
    a.append(b)
    print(a)
    print()

两个数组,a 每次都增加一个数组 b,结果应该是[[0]], [[0], [0,1]], [[0], [0, 1], [0, 1, 2]].......
可是实际结果是a里的每个元素都相等,成了 [[0]], [[0, 1], [0, 1]], [[0, 1, 2], [0, 1, 2], [0, 1, 2]]
实在搞不懂,求大神帮助!!!

3683 次点击
所在节点    Python
22 条回复
zgoing
2015-04-29 14:36:18 +08:00
缩进错了不显示了,其实应该是从第四行起全部缩进
Mush
2015-04-29 14:36:43 +08:00
没缩进的Python代码是完全没法看的......
Livid
2015-04-29 14:40:27 +08:00
@zgoing 为你更新了一下帖子,下次请用 Markdown 发帖接口:

https://www.v2ex.com/new

并使用 Markdown 语法,这样帖子中的代码就可以高亮显示了。
cloverstd
2015-04-29 14:46:08 +08:00
因为 b 是一个数组,是引用
id(a[0]) == id(b)
cloverstd
2015-04-29 14:46:45 +08:00
关键字应该是 python deep copy
staticor
2015-04-29 15:01:06 +08:00
改成 append(b[:])
zgoing
2015-04-29 15:04:26 +08:00
@staticor 非常感谢,解决了!!
zgoing
2015-04-29 15:06:38 +08:00
@Livid 谢谢!!
lixia625
2015-04-29 15:07:23 +08:00
goodryb
2015-04-29 15:11:26 +08:00
你每次都是把b添加进去,相当于a[0]=b,a[1]=b ... a[n]=b,所以a中的每个元素都是相同的

假设b=[0,1,2],a.append(b)和a.append([0,1,2])是不一样的,看下面的例子

>>> b=[0,1,2]
>>> b
[0, 1, 2]
>>> a=[]
>>> a.append(b)
>>> a.append([0,1,2])
>>> a
[[0, 1, 2], [0, 1, 2]]
>>> b.append(3)
>>> a
[[0, 1, 2, 3], [0, 1, 2]]
>>>
twor2
2015-04-29 15:19:52 +08:00
zgoing
2015-04-29 19:05:52 +08:00
@goodryb 感觉这个真是坑。。。
zgoing
2015-04-29 19:07:51 +08:00
@twor2 这个好!不用import copy
zgoing
2015-04-29 19:13:28 +08:00
@goodryb
@twor2
为什么在类里面 b.copy() 不管用呢
zgoing
2015-04-29 19:19:45 +08:00
@lixia625 这个太具体了
hansnow
2015-04-29 22:12:34 +08:00
我记得我在javascript里也遇到过类似的问题,原因就是b只是个地址
Andrewliu
2015-04-29 22:59:48 +08:00
深浅拷贝问题,
fanta
2015-04-30 09:52:41 +08:00
还是你没有完理解Python 所至.
zgoing
2015-04-30 11:24:26 +08:00
@fanta 嗯,是的,才学python
fanta
2015-04-30 12:13:54 +08:00
@zgoing 可以参考: https://github.com/qyuhen/book Python 笔记.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/187235

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX