2013-07-27 25 views
0

必须缺少明显的东西,但为什么这个简单的循环无法修改列表项?使用for循环修改列表项目

for artist in artists: 
    artist = artist.replace(': ', '') 

artists = [': Terence Trent D Arby', ": Guns N' Roses", ': Sinead O Connor' ...] 

回答

3

循环控制变量仅仅是一个局部变量,引用列表的元素。如果您将该变量重新分配给任何其他对象,它将不再引用列表中的原始对象。因此,将artist分配给另一个对象,不会使list中的引用也指向新对象。

要做你想做的事,你可以创建一个带有修改值的新列表,并将其分配给原始列表引用。列表解析在这里很有用:

artists = [artist.replace(': ', '') for artist in artists] 
+0

我不认为“字符串是不可改变的”与它有任何关系。 – arshajii

+1

@arshajii。它有。如果您有列表的列表,则更改列表将反映在列表中。当然,将列表引用分配给新列表不会改变列表的列表。 –

+1

我明白,但是OP似乎已经承认弦的不变性,因为他首先被重新分配。他没有得到预期结果的原因是由于在for-loop中重新分配循环控制变量没有任何作用,正如你刚才所说的那样。我认为这就是问题所在。 – arshajii

1

以下声明只是使artist来引用更改值;这不会更改列表值。

artist = artist.replace(': ', '') 

尝试下面的代码,其使用列表理解:

artist = [artist.replace(': ', '') for artist in artists] 
0

随着罗希特说,艺术家是不是到列表项的引用,因此无论您使用列表理解,所建议的,这是国际海事组织最彻底的方法,无论你做它的“老派”就是这样,只是为了让你了解它是如何工作背后的列表理解罗希特给你:

for index,artist in enumerate(artists): 
    artists[index] = artist.replace(': ', '') 

但我会做这种方式:

artists = [artist[2:] for artist in artists] 

只有当所有的Y当然,列表中的项目总是以“:”开头。切片可能比替换更快。