2012-03-30 89 views
1

可能重复:
Python list confusionPython的乘法运算

我是新手到Python。请让我知道为什么stairlist [1] [0] =当stairlist = [0,0] * 8

>>> stairlist = [[0,0]] * 8 
>>> stairlist 
[[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]] 
>>> stairlist[1][0] = 2 
>>> stairlist 
[[2, 0], [2, 0], [2, 0], [2, 0], [2, 0], [2, 0], [2, 0], [2, 0]] 

初始化2语句将所有数值但是,当我初始化根据stairlist变量以下然后它工作正常。

>>> stairlist = [[1,2],[1,2]] 
>>> stairlist 
[[1, 2], [1, 2]] 
>>> stairlist[1][1] = 3 
>>> stairlist 
[[1, 2], [1, 3]] 
+0

貌似'[[0,0]] * 8'语法使用别名,而不是独立的副本。不确定这是在规范中还是实施问题。 – jpm 2012-03-30 20:33:20

+0

@FelixKling,不错的地方。 – jpm 2012-03-30 20:34:42

+0

@jpm:是的,它在规范中。它被称为*序列重复*。请参阅http://docs.python.org/library/stdtypes.html#sequence-types-str-unicode-list-tuple-bytearray-buffer-xrange note(2),并注意副本被定义为浅拷贝。 – 2012-03-30 20:39:14

回答

1

array * number将通过在原始数组中创建每个对象的次数副本来创建一个新数组。由于[0,0]本身就是一个数组,因此它是一个合适的对象,新数组只包含一堆对同一个[0,0]数组的引用。当你改变一个,你改变他们所有人。

用于比较:

simplelist = [0] * 8 
[0, 0, 0, 0, 0, 0, 0, 0] 
simplelist[1] = 2 
[0, 2, 0, 0, 0, 0, 0, 0] 
+0

你是什么意思“因此是一个适当的对象”?一个'int'是一个适当的对象。此外,该类型被称为“列表”。因为对于所有阵列来说这不是真的,所以你需要具体。你的例子试图展示什么?你不是他做同样的事情。如果他要做'旋臂式[1] = 2',他会得到完全相同的行为。 – agf 2012-03-30 20:44:36