【问题标题】:Array inside an array in Python [duplicate]Python中的数组内的数组[重复]
【发布时间】:2014-12-07 12:46:29
【问题描述】:

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

我将一个元素(例如 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' 附加到第二个数组,而是再次附加到两个数组。

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

【问题讨论】:

  • 在创建列表时使用arr = [[] for _ in range(2)]
  • 众多重复之一

标签: python arrays recursion iteration


【解决方案1】:

这是因为

arr = [[]] * 2

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

【讨论】:

    【解决方案2】:

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

    >>> 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返回对象的地址,在这里,都是一样的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-15
      • 1970-01-01
      • 2018-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-21
      • 1970-01-01
      相关资源
      最近更新 更多