0

这两个说的不是完全一样的吗?为什么当我运行第一个时,我只得到列表中的最后一项,但第二个得到 ["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]
4

5 回答 5

5

for循环中,您将 name 替换contentstring。实际上,列表内容\n被替换为的最后一项''将由 name 指向content

在第二个列表推导中,您将创建一个列表,其中列表中的每个项目content用最后一个字符替换,''并将新列表分配给名称content

于 2013-06-16T05:20:26.827 回答
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",""))
于 2013-06-16T05:24:44.840 回答
1

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

于 2013-06-16T05:19:27.450 回答
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"),以此类推。)

于 2013-06-16T05:21:12.520 回答
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

这里两个块是等价的。

于 2013-06-16T05:50:22.373 回答