Python中数组内的数组

时间:2014-10-13 01:31:04

标签: python arrays recursion iteration

这不是一个关于错误的问题。相反,澄清事情是如何运作的。

我将一个元素(例如0)放在一个数组中,该数组也位于数组中。迭代地执行它,代码看起来像这样:

arr = [[0 for x in range(2)] for x in range(2)]

递归,

def zero(array,n,i):
if i >= n:
    return array
else:
    array[i].append(0)
    return zero(array,n,i+1)

arr = [[]] * 2
print zero(arr,2,0)

他们都会有这样的输出:         [[0,0],[0,0]]

我没有得到递归的过程(我只是偶然通过反复试验来制作代码)。

我没有得到的是因为我在第一个数组(索引为零)中将0加到较大的数组中,不应该' 0' 0' 0仅附加在第一个数组而不是第二个数组?但事实并非如此,' 0' 0附加到两个数组。当它返回功能时,而不是附加' 0' 0到第二个数组,它再次附加到两个数组。

我试图追踪它,但我真的不明白它是如何发生的。谢谢你的回复。

2 个答案:

答案 0 :(得分:2)

这是因为

arr = [[]] * 2

正在创建对同一列表构造的另一个引用。所以你有一个包含两个元素的数组,这两个元素都是对同一个列表的引用。因此,在其中一个上的应用程序,例如附加元素,将导致相同的操作被往复移动到另一个。

答案 1 :(得分:1)

使用交互式解释器分解列表理解的组成部分:

>>> arr = [[0 for x in range(2)] for x in range(2)]
>>> print arr
[[0, 0], [0, 0]]
>>> inner_array = [0 for x in range(2)]
>>> print inner_array
[0, 0]
>>> total_arr = [inner_array for x in range(2)]
>>> print total_arr
[[0, 0], [0, 0]]

所以你有一个[0,0]数组,然后把它放在外部列表理解中,由于range(2)组件,它会创建两次相同的数组。

可以验证它们是完全相同的数组,如下所示:

>>> id(inner_array)
139834121190864
>>> id(total_arr[0])
139834121190864
>>> id(total_arr[1])
139834121190864

id返回对象的地址,在这里,它们都是相同的。