现在,我知道在迭代循环中修改列表是不安全的。但是,假设我有一个字符串列表,并且我想剥离字符串本身。可变值的替换是否算作修改?
它被认为是不良形式。如果需要保留对列表的现有引用,请改用列表理解和切片分配。
a = [1, 3, 5] b = a a[:] = [x + 2 for x in a] print(b)
由于下面的循环仅修改已经看到的元素,因此可以接受:
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