循环列表的两种方式 - 差异

时间:2018-05-12 00:01:09

标签: python

我必须反转列表中的每个单词,其长度大于4.所以我尝试了:

for word in words:
    if len(word) >= 5:
        word = word[::-1]

它不起作用。但是这个:

 for i in range(len(words)):
        if len(words[i]) >= 5:
            words[i] = words[i][::-1]

工作正常。有什么区别?

4 个答案:

答案 0 :(得分:0)

当您遍历列表时,Python会为您的变量创建引用(具有相同的ID)。但是这些不可编辑。例如,检查一下:Can't modify list elements in a loop Python

考虑这个希望可以帮助你的例子:

words = ['abcdef','abc']

for ind,i in enumerate(words):
    print('Loop {}'.format(ind))
    i = i[::-1]
    print('words equal {}'.format(words))
    words[ind] = words[ind][::-1] 
    print('words equal {}'.format(words))    
    print()

返回:

Loop 0
words equal ['abcdef', 'abc']   # <--- after changing i (nothing changed)
words equal ['fedcba', 'abc']   # <--- after changing words[ind]

Loop 1
words equal ['fedcba', 'abc']   # <--- after changing i (nothing changed)
words equal ['fedcba', 'cba']   # <--- after changing words[ind]
在您的情况下

最简单的解决方案是使用列表理解。考虑一下:

rWords = [word[::-1] if len(word) >=5 else word for word in words]

答案 1 :(得分:0)

    word = word[::-1]

单词未引用单词[i]。 您可以通过函数式编程来完成此任务。

new_words = list(word[::-1] if len(word) >= 5 else word for word in words)

答案 2 :(得分:0)

要了解这里发生了什么,请比较类似示例中发生的情况,我想将任何大于20的数字设置为-1:

numbers = [1, 10, 30, 40, 50]
for number in numbers:
    if number > 20:
        number = -1
print(numbers) # same as before!

为什么这不会将最后三个数字设置为-1?因为number这里是一个值 - 它在内存中的位置与numbers数组的内容完全无关。您示例中的word完全相同。

在循环中,word绑定到一块新内存,其内容恰好与words数组的当前条目相同。在您的第一个代码段中定义word时,您已经失去了操纵它来自的阵列位置的任何方法。通过在第二个代码段中迭代索引,可以在数组中保留后门。

这两个参考文献,

可能有助于理解以下棘手的业务:如果我们有一个列表列表会发生什么,而不是字符串列表?

listOfLists = [[1], [2, 3], [9, 10, 11], [40, 50, 60, 70]]
for l in listOfLists:
    if len(l) >= 3:
        l[:] = l[::-1] # note that `[:]`!!!
print(listOfLists)

这实际上会反转任何包含2个以上元素的子列表。你明白为什么吗?如果是这样,请拿这个金星:!

答案 3 :(得分:0)

原因是因为当你做第一个时,你只是修改了 word 变量,你没有修改 words 列表。但是当您使用第二个示例时,您正在修改它,因为您使用的是 words[i] = words[i][::-1]。在此示例中,您正在修改单词列表,因为 words[i] 是修饰符;您正在将列表的元素设置为某物。