Python 数组可以动态增长,但是简单地为一个索引赋值并不能扩展数组。
数组有 extend
方法,可以从集合中一次性添加多个项。例如:
>>> a = [1, 2, 3]
>>> a.extend([None, None])
>>> a
[1, 2, 3, None, None]
您可以这样模拟自动扩展数组赋值:
def arr_assign(arr, key, val):
try:
arr[key] = val
return
except IndexError:
assert key >= 0
arr.extend(((key + 1) - len(arr)) * [None])
arr[key] = val
return
例如:
>>> a = []
>>> arr_assign(a, 4, 5)
>>> a
[None, None, None, None, 5]
作为附录,那些默认具备自动扩展行为的语言(例如Perl、Ruby、PHP、JavaScript和Lua)往往比Python更加宽松,如果您访问数组中不存在的槽位,则它们会返回一个神奇的空值。这意味着它们可以允许在分配给不存在的索引时进行自动扩展,而不会改变任何其他索引处数组的行为。
例如,在Ruby中,尽管a已经在其下发生了变化,但a[2]并没有改变。
irb(main):006:0> a = []
=> []
irb(main):007:0> a[2]
=> nil
irb(main):008:0> a[4] = 7
=> 7
irb(main):009:0> a
=> [nil, nil, nil, nil, 7]
irb(main):010:0> a[2]
=> nil