2011-04-04 121 views
5

下面的代码正常工作对我来说:为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 

回答

6

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

你比我的代码短,我必须改成这种方法,谢谢 – kn3l 2011-04-04 21:03:34

+0

你是指obj [x]我们只访问不能分配? – kn3l 2011-04-04 21:04:18

+0

您可以访问*和*赋值,但只能访问已经存在的*列表中的位置。 – 2011-04-04 21:06:52

1

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

编辑:如果您打包列表,您可以在自己的类中覆盖该行为,如果您由于某种原因需要它。在这里看到:

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

+0

好tips.thanks Santiago Lezica – kn3l 2011-04-04 21:06:05

4

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

l = [0] * N 

要使用的0

值初始化列表中N个元素或者你可以只是做:

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

我同意。我的经验是,我没有事先初始化列表,因此该值无法分配到列表中。谢谢 – 2017-03-28 10:43:00

3

值有在您分配给它之前存在。第一次循环,i为0,并且l[0]尚不存在。