更新列表是否需要额外的空间?

时间:2017-01-24 20:38:43

标签: python space-complexity

我有array or list, 现在我想在数组中进行一些更改,然后返回arr variable/list。我使用额外的空间吗?或者是同一个变量再次更新?

arr = [1,2,3,4]
print arr[2:] + arr[:2] # Is is using extra space
#or
arr = arr[2:] + arr[:2] # Is is using extra space
#or
arr = [1,2,3,4]
arr = arr # are not they both same? LHS arr is different from RHS arr

2 个答案:

答案 0 :(得分:2)

分配时如下:

arr = arr[2:] + arr[:2]

您正在创建arr的新引用,旧的引用将被销毁。意味着分配/删除。

您应该切片分配

arr[:] = arr[2:] + arr[:2]

arr保留相同的引用,如果大小没有变化,则arr不会发生内存分配(但右侧的总和和切片仍然需要分配)

演示:

arr = [1,2,3,4]
old_arr = arr
arr = arr[2:] + arr[:2]
print(old_arr is arr)

结果:False

arr = [1,2,3,4]
old_arr = arr
arr[:] = arr[2:] + arr[:2]
print(old_arr is arr)

结果:True

答案 1 :(得分:0)

<1,2,3,4>存储在内存中的某个位置。 arr引用了<1,2,3,4>arr[2:]引用了<3,4>引用的相同arr

对于数字列表,您为这些引用使用了额外的空间,而不是数字本身。

对于高调对象的列表,这实际上变成了一种更有效的处理内存的方法。

我建议通读一下:
http://foobarnbaz.com/2012/07/08/understanding-python-variables/