有人碰到过这样诡异的事情吗?

2012-04-28 21:10:08 +08:00
 thedevil7
groups 是一个列表, 里面的元素还是列表.
grpNum 是 int, 等于 0.
groups[grpNum].append(1)
结果 groups = [ [1], [1], [1] ]
本来只应该出现在第一个元素里面的1, 其余的元素里都有...

我单独用 python3 测试过基本相同的语句, 没有这样的问题...

源代码(错误代码用 # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # 标出了)
http://gist.github.com/2518948
2884 次点击
所在节点    Python
15 条回复
tuoxie007
2012-04-28 21:21:06 +08:00
可能是一级数组中的指针指向了同一个[],建议检查一下id是否相同
tuoxie007
2012-04-28 21:23:44 +08:00
如果是这样的话,换成list()试试,我在外面,没有命令行可以试
quake0day
2012-04-28 22:36:34 +08:00
>>k=[]
>>k.append([])
>>k.append([])
>>k.append([])
>>k
[[],[],[]]
>>k[0].append(1)
>>k
[[1],[],[]]
Python 2.7.3没问题
reorx
2012-04-28 22:46:49 +08:00
@tuoxie007 似乎只可能是这种情况,但列表作为可变对象,在创建的时候是不会查找缓存或出现重复的。[] is [] 得到的结果会是False,用不用list()都是一样的。这样说,我也没看出来问题出在哪里。。。
yuelang85
2012-04-28 22:55:29 +08:00
这个函数没有问题。

检查下各个self.__groups的赋值语句?最好能把他们贴出来,尤其是self._groups的初始化语句。
thedevil7
2012-04-28 22:56:58 +08:00
@tuoxie007 id 一模一样。。。这个。。
yuelang85
2012-04-28 23:01:12 +08:00
@thedevil7 id一模一样说明是同一个对像哇。不过这个也说明不了啥,因为你这种情况除了自定义了append函数以外,基本上就是因为同一个对象。所以能不能把self._groups的初始化语句贴出来?
binux
2012-04-28 23:02:21 +08:00
你是这么初始化的吧
groups = [[]]*3
yuelang85
2012-04-28 23:03:23 +08:00
我最怀疑的,就是在初始化语句那里写了这么样的一段:

self._group_amount = 10

self._groups = [[]] * self._group_amount
yuelang85
2012-04-28 23:03:49 +08:00
@binux 哈哈哈,握爪
thedevil7
2012-04-28 23:04:35 +08:00
@binux 额...这个..确实是的...有问题?
binux
2012-04-28 23:06:06 +08:00
@thedevil7 这么写是把引用拷贝了n次给你。。
thedevil7
2012-04-28 23:06:31 +08:00
@binux @yuelang85 @reorx @quake0day @tuoxie007
谢谢各位, 问题被解决了 groups = [ [],[],[] ] 就没事了....
这是怎么回事阿....求解释,求教育
thedevil7
2012-04-28 23:09:04 +08:00
@binux 原来是这样阿...真是坑爹阿..... 那重么写呢...
难道 while i < 3 :
. append([]) ?
binux
2012-04-28 23:11:19 +08:00
@thedevil7 [[] for i in range(n)]

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

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

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

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

© 2021 V2EX