3 回答
TA贡献1712条经验 获得超3个赞
这被认为是糟糕的形式。使用列表理解,如果需要保留对列表的现有引用,则使用切片分配。
a = [1, 3, 5]
b = a
a[:] = [x + 2 for x in a]
print(b)
TA贡献1818条经验 获得超3个赞
由于下面的循环只修改了已经看到的元素,因此可接受:
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
TA贡献1848条经验 获得超2个赞
for idx in range(len(list)): list[idx]=... # set a new value # some other code which doesn't let you use a list comprehension
添加回答
举报
