for 循环中列表项未更改

Som*_*ing 0 python loops list

当以下代码没有达到我预期的效果时,我感到震惊:

lines_list = ['this is line 1\n', 'this is line 2\n', 'this is line 3\n']
for line in lines_list:
    line = line.strip()
Run Code Online (Sandbox Code Playgroud)

PerlJava中,我的用法效果很好。Python 是具有独特行为的Python。

在 Java 中,这将起作用:

lines_list = ['this is line 1\n', 'this is line 2\n', 'this is line 3\n']
for line in lines_list:
    line = line.strip()
Run Code Online (Sandbox Code Playgroud)

在 Perl 中,这将起作用:

String[] lines = {"this is line 1\n", "this is line 2\n", "this is line 3\n"};
for (String line : lines) {
    line = line.trim();
}
Run Code Online (Sandbox Code Playgroud)

我当然希望列表中的每个项目都成为"stripped",即在这种情况下,没有尾随'\n'字符,但它没有......

print lines_list
Run Code Online (Sandbox Code Playgroud)

输出:

['this is line 1\n', 'this is line 2\n', 'this is line 3\n']
Run Code Online (Sandbox Code Playgroud)

有没有一种优雅的方法可以在循环期间更改列表项for?我不想重复这个列表...

Rya*_*ing 5

您最初关于 python 独特性的说法是不正确的。如果运行 Java 代码然后打印内容,lines您将看到该数组包含原始未剥离的字符串,其原因与 python 相同。


您可以按索引浏览并以这种方式就地修改

for i, _ in enumerate(lines_list):
    lines_list[i] = lines_list[i].strip()
Run Code Online (Sandbox Code Playgroud)

虽然我认为如果列表不是太大而导致问题,很多人会更喜欢复制列表的简单性

lines_list = [line.strip() for line in lines_list]
Run Code Online (Sandbox Code Playgroud)

问题是使用=运算符重新分配给变量line,它不会做任何事情来影响原始字符串的内容。新的 Python 程序员在以下情况下同样会感到惊讶:

for i in range(10):
    print(i)
    i += 1
Run Code Online (Sandbox Code Playgroud)

打印数字 0,1,2,3,4,5,6,7,8,9。发生这种情况是因为 for 循环i在每次迭代开始时重新分配给范围中的下一个元素。这不完全是你的问题,但很相似。

由于您正在从文件中读取行,然后将其剥离,所以您真正应该做的是

with open(file_name) as f:
    lines_list = [line.strip() for line in f]
Run Code Online (Sandbox Code Playgroud)

一次读取并剥离一行,而不是先读取所有内容,然后再剥离行