--
来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
发言: pyth...@googlegroups.com
退订: python-cn+...@googlegroups.com (向此发空信即退!)
详情: http://code.google.com/p/cpyug/wiki/PythonCn
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
强烈: 建议使用技巧: 如何有效地报告Bug
http://www.chiark.greenend.org.uk/%7Esgtatham/bugs-cn.html
这个问题我的解释就是:只有两重 list 的 * 操作才会出现引用拷贝问题。一重 list 是值拷贝的。
因此 [0] * 3 ,此过程发生的是值拷贝, [0] *3 *5 也是值拷贝,只有 [[0]*3]*5,这样的两重 list,在内层
list 中会存在引用拷贝的问题。
alist = [A()] * 5
print alist
我不认同这样的理解。
[[0]*3]*5 是
L1 = [0]
L2 = L1 + L1 + L1
= [0, 0, 0]
L3 = [L2]
L4 = L3 + L3 + L3 + L3 + L3
= [L2, L2, L2, L2, L2]
别管 C++/Java 的引用拷贝和值拷贝之类的东西。在 Python 里,变量就是对象的
名字。很明显 L4 中是五个 L2,你不管叫哪个都是那个对象。就像一个人可以有
很多不同的职位,你不管通过哪个职位找到的人都是他。你通过他的职位 A 把那
个人找到,然后与他交换了一件物品。当你再通过另一个职位找到他时,他当然依
旧还是拥有那件礼品(L4[0][1] = 1; print L4[1][1])。人家有三件物品(比如
三只一样的杯具),你把他的第一件交换走了,另外两件当然还在那儿。
--
Best regards,
lilydjwg
Linux Vim Python 我的博客
http://lilydjwg.is-programmer.com/
了解了,确实我的理解错误,楼主那个情况的真正问题在于 a[0][0] = 1 只是交换了这一件物品,也就是说把 1 取出来把 0
放进去了,而不是把 0 改成了 1。
如果楼主的问题里面,把所有的 0 都换成某个对象,然后调用对象的某个方法去修改对象本身(而不是把对象替换成另外一个对象),这样就会发现 15 个对象全部更改了。