这两个说的不是完全一样的吗?为什么当我运行第一个时,我只得到列表中的最后一项,但第二个得到 ["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]
在for
循环中,您将 name 替换content
为string。实际上,列表内容中\n
被替换为的最后一项''
将由 name 指向content
。
在第二个列表推导中,您将创建一个列表,其中列表中的每个项目content
用最后一个字符替换,''
并将新列表分配给名称content
。
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",""))
他们不会说同样的话。在您使用for
循环的第一个示例中,在每次迭代中,您将名称分配给content
列表中的单个项目(line
,替换了一些文本)。 content
每次都被覆盖,所以最后只有最后一个元素。在第二个示例中,您创建一个全新的列表并将其分配给content
.
对于第一个,您使用 更新内容的值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"),以此类推。)
与您的原始版本最接近的固定版本:
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
这里两个块是等价的。