2017-01-19 67 views
3

我想創建一個字符串列表。除了一些元素之外,絃樂應該都是相同的,它們應該是不同的。這樣做,我碰到一個奇怪的現象:更改字符串列表中的元素

x = ['spam', 'spam', 'spam', 'spam', 'spam'] 
x[1] = 'buzz' 
x[2] = 'buzz' 
x 

Out[35]: ['spam', 'buzz', 'buzz', 'spam', 'spam'] 

但在另一方面:

y = ['spam'] * 5 
y[1:3] = ['buzz'] 
y 
Out[36]: ['spam', 'buzz', 'spam', 'spam'] 

可有人懇求告訴我什麼,我做錯了什麼?非常感謝您的幫助!

+0

in'y [1:3] = ['buzz']'make'y [1:3] = ['buzz'] * 2' –

回答

3

分配:

y = ['spam'] * 5 

會造成y要像列表這個:

['spam', 'spam', 'spam', 'spam', 'spam'] 

陣列切片y[1:3]捕獲索引1和2的元件,並且看起來像這樣:

['spam', 'spam'] 

對齊切片到陣列索引1處(其中片開始):

 
['spam', 'spam', 'spam', 'spam', 'spam'] # y 
     ['spam', 'spam']     # y[1:3] 

現在,當你進行分配y[1:3] = ['buzz'],它實質上是將本到下面:

 
['spam', 'buzz', 'spam', 'spam'] 
     ['buzz']     
1

y[1:3]是列表中的一部分,您將該切片替換爲由單個元素組成的列表。

spam spam spam spam spam 
    \  /
     \ /
     \ /
spam buzz spam spam 

IIUC,你想要做的就是用一個由N倍新元素(buzz)組成的相同大小的列表替換它。

你可以寫

y[1:3] = ['buzz', 'buzz'] 
# or equivalently 
y[1:3] = ['buzz'] * 2 

這比使用一個循環像這樣等同,更高效:

for i in [1, 2]: 
    y[i] = 'buzz' 
# or equivalently 
for i in range(1, 3): 
    y[i] = 'buzz' 

一點題外話,這裏的另一個陷阱。字符串是一個迭代器,所以每當一個迭代的預期,你傳遞一個字符串,該字符串遍歷每個字符的字符,如單字符字符串列表:

y[1:3] = 'buzz' 
print(y) 
# ['spam', 'b', 'u', 'z', 'z', 'spam', 'spam', 'spam'] 

在這種情況下,片[1:3]是替換爲您提供的迭代器,即'buzz',視爲['b', 'u', 'z', 'z']

+0

哇,你們真快!感謝所有的答案! – Benjamin

0
y[1:3] = ['buzz'] 

這是不一樣的y[1] = 'buzz'y[2] = 'buzz'

只是做一個for循環

for i in [1,2..whatever you need to change]: 
    y[i] = 'buzz' 
相關問題