这不是一个关于错误的问题。相反,澄清事情是如何运作的。
我将一个元素(例如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到第二个数组,它再次附加到两个数组。
我试图追踪它,但我真的不明白它是如何发生的。谢谢你的回复。
答案 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
返回对象的地址,在这里,它们都是相同的。