难道这两个人说的完全一样吗?为什么当我运行第一个时,我最终只得到列表中的最后一项,但我得到[“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]
答案 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
这两个块是等价的。