对于f中的行:为什么在列表中替换时有区别?

时间:2013-06-16 05:17:26

标签: python loops replace line

难道这两个人说的完全一样吗?为什么当我运行第一个时,我最终只得到列表中的最后一项,但我得到[“a”,“b”,“c”]为第二个?

content = ["a\n","b\n","c\n"]

for line in content:
    content = line.replace("\n","")

content = [line.replace("\n","") for line in content]

5 个答案:

答案 0 :(得分:5)

for循环中,您将使用字符串替换名称content。实际上,名称\n将指向列表内容''替换为content的最后一项。

在第二个列表理解中,您正在创建一个列表,其中包含content列表的每个项目,最后一个字符替换为''并将新列表分配给名称content

答案 1 :(得分:4)

result = [a_func(elem) for elem in a_list]

相当于

result = []
for elem in a_list:
    result.append(a_func(elem))

因此,在您的示例中,等于列表理解 for循环

result = []
for line in content:
    result.append(line.replace("\n",""))

答案 2 :(得分:1)

他们没有说同样的话。在第一个带有for循环的示例中,在每次迭代中,您都会将名称content分配给列表中的单个项目(line,并替换一些文本)。每次都会覆盖content,所以最后只有最后一个元素。在第二个示例中,您创建一个全新的列表并将其分配给content

答案 3 :(得分:1)

对于第一个,您使用line.replace("\n", "")更新内容的值。内容中的每个元素都会发生这种情况。由于'c \ n'是最后一个元素,因此该行在迭代结束时的值为'c \ n',并将其分配给内容。

#Trace of loop
#iteration 1: line = "a\n"
content = line.replace("\n","") (which is 'a')
#iteration 2: line = "b\n"
content = line.replace("\n","") (which is 'b')
#iteration 3: line = "c\n"
content = line.replace("\n","") (which is 'c')

因此,内容的值为'c'

第二个是列表理解,它意味着:

[ "a\n".replace("\n",""), "b\n".replace("\n",""), "c\n".replace("\n","") ]

(即这个新列表的第一个元素是line.replace("\n",""),其中line占据内容的第一个元素(“a \ n”),而这个新列表的第二个元素是line.replace("\n",""), line采用内容的第二个元素(“a \ n”),依此类推。)

答案 4 :(得分:0)

与您的原始版本最匹配的固定版本:

content = ["a\n","b\n","c\n"]

for i in range(len(content)):
    content[i] = content[i].replace("\n","")
print content

content = ["a\n","b\n","c\n"]
content = [line.replace("\n","") for line in content]
print content

这两个块是等价的。