この二人は全く同じことを言っているではないか。最初の項目を実行すると、リストの最後の項目だけになってしまうのに、2 番目の項目では ["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
\n
''
content
2 番目のリスト内包表記では、リストの各項目の最後の文字を で置き換えたリストを作成し、新しいリストを名前に割り当てています。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
に名前を割り当てます( 、一部のテキストを置き換えます)。 毎回上書きされるので、最後の要素だけが最後にあります。2 番目の例では、まったく新しいリストを作成し、それを に割り当てます。content
line
content
content
最初のものでは、 content の値を で更新しline.replace("\n", "")
ます。これは、コンテンツの各要素で発生し続けます。'c\n' は最後の要素であるため、繰り返しの最後に行の値が 'c\n' になり、それを content に割り当てます。
#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」です
2 つ目はリスト内包表記で、次のことを意味します。
[ "a\n".replace("\n",""), "b\n".replace("\n",""), "c\n".replace("\n","") ]
(つまり、この新しいリストの最初の要素はline.replace("\n","")
であり、行は内容の最初の要素 ("a\n") を取り、この新しいリストの 2 番目の要素はline.replace("\n","")
であり、行は内容の 2 番目の要素 ("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
ここで、2 つのブロックは等価です。