一个python程序,关于二维数组,不知道怎么回事……

源码:
a=[];pool=[]
for times in range(1,5):
a.append(0)
for times in range(1,5):
pool.append(a)
print pool
pool[1][2]='here'
print 'another'
print pool

输出:
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
another
[[0, 0, 'here', 0], [0, 0, 'here', 0], [0, 0, 'here', 0], [0, 0, 'here', 0]]

为什么改个元素会改4个数组里的数?

因为这里修改的是数组a的第三个值,而数组pool只是存储了三个链接到数组a的一个二维数组。
这里有个更简单点的例子,看一下就知道了:

>>> a=[1,2,3]
>>> b=[a,[4,5,6]]
>>> print a
[1, 2, 3]
>>> print b
[[1, 2, 3], [4, 5, 6]]
>>> a[1]=10
>>> print a
[1, 10, 3]
>>> print b
[[1, 10, 3], [4, 5, 6]]
>>>

这个在Learning Python 里,关于变量的部分有介绍,隐约记得好像是讲关于“连接”的部分
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-11-20
你可以把a看成是指向列表所在内存空间的指针,所以四次的append(a)其实是添加了四次对同一个地址空间的引用。
如果想每次创建一个新的列表可以这么写:
pool.append(a[:]) #切片操作本回答被提问者采纳
第2个回答  2009-11-20
因为这里修改的是数组a的第三个值,而数组pool只是存储了三个链接到数组a的一个二维数组。
这里有个更简单点的例子,看一下就知道了:

>>> a=[1,2,3]
>>> b=[a,[4,5,6]]
>>> print a
[1, 2, 3]
>>> print b
[[1, 2, 3], [4, 5, 6]]
>>> a[1]=10
>>> print a
[1, 10, 3]
>>> print b
[[1, 10, 3], [4, 5, 6]]
>>>
相似回答