我必须反转列表中的每个单词,其长度大于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]
工作正常。有什么区别?
答案 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]
是修饰符;您正在将列表的元素设置为某物。