为Python列表分配值不起作用?

时间:2011-04-04 20:54:57

标签: python

以下代码适合我:

# -*- coding: utf-8 -*-
N = int(raw_input("N="))
l=[]
i = 0
while i<N:
   n = raw_input("e"+str(i)+"=")
   l.append(n) 
   i = i+1   
print l  

但是,为什么我不能使用l[i] = raw_input("e"+str(i)+"=")来简化它?

示例:(不起作用)

# -*- coding: utf-8 -*-
N = int(raw_input("N="))
l=[]
i = 0
while i<N:
   l[i] = raw_input("e"+str(i)+"=")
   i = i+1   
print l 

4 个答案:

答案 0 :(得分:8)

您只能使用索引(例如obj[x])来访问或修改list中已存在的项目。例如,以下方法有效,因为我们正在访问的列表中的位置已存在:

>>> chars = ['a', 'b', 'c']
>>> chars[0]
'a'
>>> chars[0] = 'd'
>>> chars
['d', 'b', 'c']

但是,访问或修改list 不存在位置的项目将无效

>>> chars = ['a', 'b', 'c']
>>> chars[3]
...
IndexError: list index out of range
>>> chars[3] = 'd'
...
IndexError: list assignment index out of range
>>> chars
['a', 'b', 'c']

如果您想简化代码,请尝试:(它使用list comprehension

N = int(raw_input("N="))
l = [raw_input("e" + str(i) + "=") for i in range(N)]
print l

答案 1 :(得分:4)

我认为在你的第二个例子中,我认为你的意思是为什么你不能直接分配列表元素。答案是因为元素尚未初始化即。列表大小仍为0.您可以

l = [0] * N

将列表初始化为N个元素,值为0.

或者你可以这样做:

l.append(raw_input("e"+str(i)+"="))

答案 2 :(得分:3)

必须存在一个值才能分配给它。第一次循环时,i为0,l[0]尚不存在。

答案 3 :(得分:1)

简短回答:因为[]运算符不像列表那样工作。它允许您访问列表中的现有索引,仅此而已。

编辑:如果你包装一个列表,你可以在你自己的类中覆盖这种行为,如果你出于某种原因需要它。见这里:

http://docs.python.org/release/2.5.2/ref/sequence-types.html