Python 3 教程 在线

1063Python3 列表

有时在取 list 中元素时可能会遇到以下情形:

>>> a=[]
>>> a[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

这种情况发生是因为只定义了一个空列表,没有进行任何的赋值,所以列表里什么也没有,而后面的报错也明确表示了索引超出范围,即写上的0其实是第一位值的位置,而此时是空列表没有赋值,故而报错。

而如果我们使用以下语句则不会报错:

>>> a[0:]
[]

这个不是什么小技巧,这是不一样的语句意义,这句话其实是把这个列表 a 里的所有值都输出,其效果和下面表达的最终结果是一致的。

>>> a[:]
[]

而这个语句并不能避免上面报错中超出索引范围的错误,这个根本就是两种不同的意义的语句。a[0:] 和 a[:] 在脚本输出时相当于 print(a) 的意思。这不是解决错误的方式,不能将它当成 trick 来用。

1062Python3 列表

空列表可以简单地通过两个中括号进行表示([])- 一里面什么东西都没有,但是,如果想创建一个占用十个元素空间,却不包括任何有用内容的列表,又该怎么办呢?首先可以类似于下面的方法,用某一个具体的值代替。

>>> list_empty = [0]*10
>>> list_empty
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

这样就生成了一一个包括10个0的列表。然而,有时候可能会需要一个值来代表空一意味着没有在里面放置任何元素。这个时候就需要使用None。None 是一个Python的内建值,它的确切含意是"这里什么也没有"。因此,如果想初始化个长度为10的列表,可以按照下面的例子来实现:

>>> list_empty = [None]*10
>>> list_empty
[None, None, None, None, None, None, None, None, None, None]

这样就可以再去对list的各个元素进行初始化了

1061Python3 列表

楼上两位同学说的都对,还有一个就是用list自带的copy()方法,把重新开辟内存空间存储新列表。

original_list=[0,1,2,3,4,5,6,7,8]
copy_list=original_list.copy()
copy_list=copy_list+['a','b','c']
print("original_list:",original_list)
print("copy_list modify:",copy_list)

运行结果

original_list: [0, 1, 2, 3, 4, 5, 6, 7, 8]
copy_list modify: [0, 1, 2, 3, 4, 5, 6, 7, 8, 'a', 'b', 'c']

1060Python3 列表

@sm 同学提到的列表的复制问题,其实可以用copy模块里 copy()函数解决,实例如下:

import copy

a = [1,2,3,4]
b = a
d = copy.copy(a)
b[0] = 'b'
print(a,b,d)
print(id(a),id(b),id(d))

1059Python3 列表

列表的复制

>>> a = [1, 2, 3]
>>> b = a
>>> c = []
>>> c = a
>>> d = a[:]
>>> a, b, c, d
([1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3])
>>> b[0] = 'b'
>>> a, b, c, d
(['b', 2, 3], ['b', 2, 3], ['b', 2, 3], [1, 2, 3])
>>> id(a), id(b), id(c), id(d)
(140180778120200, 140180778120200, 140180778120200, 140180778122696)
>>> c[0] = 'c'
>>> a, b, c, d
(['c', 2, 3], ['c', 2, 3], ['c', 2, 3], [1, 2, 3])
>>> id(a), id(b), id(c), id(d)
(140180778120200, 140180778120200, 140180778120200, 140180778122696)
>>> d[0] = 'd'
>>> a, b, c, d
(['c', 2, 3], ['c', 2, 3], ['c', 2, 3], ['d', 2, 3])
>>> id(a), id(b), id(c), id(d)
(140180778120200, 140180778120200, 140180778120200, 140180778122696)

可以看到a b c 三个是同一id值,当改变当中任一列表元素的值后,三者会同步改变。

但d的元素值不会变,改变d的元素值其它三个变量内的元素值也不会变。

从a b c d 的id值来看,a b c 地址全一样,唯有d分配了新地址。

所以一般情况下想复制得到一个新列表并改变新列表内元素而不影响原列表,可以采用d的赋值方式。

这只是针对这种比较单一的普通列表。