Python中这两个数组声明有什么区别?

时间:2011-12-10 04:01:50

标签: python numpy

Python中这两个数组声明有什么区别?

table = [[0]*100]*100
table = numpy.zeros([100,100], int)

2 个答案:

答案 0 :(得分:5)

事实上他们没有任何共同之处。第二个是numpy 2D数组。第一个没有任何用处 - 它是一个包含100个项目的数组,每个项目都是对100个零的SINGLE数组的引用:

table = [[0]*100]*100
table[1][0]=222
print table[0][0]

这会打印'222'!

table = numpy.zeros([100,100], int)
table[1][0]=222
print table[0][0]

打印'0'!

答案 1 :(得分:5)

好吧,有一次,第一次危险错误。见:

In [8]: table = [[0]*2]*10

In [9]: table
Out[9]: 
[[0, 0],
 [0, 0],
 [0, 0],
 [0, 0],
 [0, 0],
 [0, 0],
 [0, 0],
 [0, 0],
 [0, 0],
 [0, 0]]

In [10]: table[0][1] = 5

In [11]: table
Out[11]: 
[[0, 5],
 [0, 5],
 [0, 5],
 [0, 5],
 [0, 5],
 [0, 5],
 [0, 5],
 [0, 5],
 [0, 5],
 [0, 5]]

这是因为您声明table的方式,子列表再次重复。有关正确执行此操作的信息,请参阅this FAQ