给Python列表赋值不起作用?

8
以下代码对我来说可以正常工作:
# -*- 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个回答

11

您只能使用索引(例如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']

如果你想简化你的代码,可以尝试使用以下方式:(它使用了一个列表推导式

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

你的长度比我的代码还短,我必须改变这种方法,谢谢。 - tree em
你的意思是对于 obj[x],我们只能访问它而不能赋值吗? - tree em
你可以访问并赋值,但只能针对已经存在的 list 位置。 - bradley.ayers
你的回答很完美,但我不太明白你在这里说了什么?你能给我一些关于这个的例子吗?谢谢。 - tree em

7

我认为在你的第二个例子中,你指的是为什么不能直接分配列表元素。答案是因为这些元素还没有被初始化,也就是说列表的大小仍然为0。你可以这样做:

l = [0] * N

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

或者你可以这样做:

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

我同意。我的经验是我没有事先初始化列表,因此无法将值分配到列表中。谢谢。 - Santosa Sandy

3

在你给一个变量赋值之前,它必须已经存在。第一次循环时,i 是0,而 l[0] 还不存在。


1
简短回答:因为[]运算符在列表中不起作用。它只允许你访问列表中已有的索引,没有其他作用。

编辑:如果你包装了一个列表,你可以在自己的类中重写这种行为,如果你出于某种原因需要它。请参见此处:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接