2011-04-04 33 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]尚不存在。