由于下面的循环只修改了已经看到的元素,它被认为是可以接受的:
a = ['a',' b', 'c ', ' d ']
for i, s in enumerate(a):
a[i] = s.strip()
print(a) # -> ['a', 'b', 'c', 'd']
不同于:
a[:] = [s.strip() for s in a]
因为它不需要创建临时列表并分配它来替换原始列表,尽管它确实需要更多的索引操作。
警告:虽然您可以通过这种方式修改条目,但您不能更改list 中的项目数,否则可能会遇到问题。
这是我的意思的一个例子——删除一个条目会从那时起破坏索引:
b = ['a', ' b', 'c ', ' d ']
for i, s in enumerate(b):
if s.strip() != b[i]: # leading or trailing whitespace?
del b[i]
print(b) # -> ['a', 'c '] # WRONG!
(结果是错误的,因为它没有删除它应该有的所有项目。)
更新
由于这是一个相当流行的答案,以下是如何有效地“就地”删除条目(即使这不是问题所在):
b = ['a',' b', 'c ', ' d ']
b[:] = [entry for entry in b if entry.strip() == entry]
print(b) # -> ['a'] # CORRECT
见How to remove items from a list while iterating?。