2016-03-30 51 views
0

私はこれらの2つの例が私に異なる出力を与える理由を理解しようとしています。(同じような)コードの出力が異なるのはなぜですか?

例1:

list1 = [1,2,3,4,5] 
list2 = [] 
for l in list1: 
    list2.append(l) 
print list2 

#[1, 2, 3, 4, 5] 

例2:

list1 = [1,2,3,4,5] 
list2 = [] 
list2.append(l for l in list1) 
print list2 

#[<generator object <genexpr> at 0x10379ecd0>] 

私は2番目の例ではAPPEND後のリスト()またはタプル()を入れて試してみたが、それは私の内の1つの単一の要素を与えています5つの異なるものとは対照的に新しいリスト。

list2.append(tuple(l for l in list1)) 

#[(1, 2, 3, 4, 5)] 

forループのために1行だけを使用してExample1から同じ出力を得る方法がありますか?

本当に助けていただきありがとうございます。

答えて

4

あなたがしたいすべてがコピーlist1されている場合は、それを行います

list2 = list1[:] 

または

list2 = list(list1) 

その後、extendの代わりに、第二の例についてappend

list1 = [1,2,3,4,5] 
list2 = [] 
list2.extend(l for l in list1) # or just list2.extend(list1) 
print list2 

が必要

0

2番目の例では、appendを使用しません。代わりに、リストをコピーする簡単な方法があります

list2 = [l for l in list1] 

をしたいが、これは最も密接にあなたが入れ子になったが気に入らない場合は、実施例2

0

のために行っているものと一致するものですリストは、あなたは、単に使用することができます:

list1 = [1,2,3,4,5] 
list2 = [] 
[list2.append(l) for l in list1] 
3

(l for l in list1)generator expressionです。これは、本質的にメモリ節約イテレータであるジェネレータを明示的に返します(リストを考えますが、すべての要素がメモリに格納されるのではなく、その場で返されます)。それを実現する鍵は、式が()で囲まれていることに注目しています。

list2.append(l for l in list1)には、ジェネレータが空のリストに追加されています。 for element in list2[0]を実行しても、必要な要素をすべて取得できますが、それは同じではありません。そのような発電式は遭遇しない

for l in list1: 
    list2.append(l) 

を行うことでしかし

、。すべての反復で - ループのすべての実行 - 要素の末尾にlが追加されます。したがって、なぜこれがあなたの思うように機能するのですか?あなたはジェネレータ式に似たものを使用して、あなたのlist2を取得したい場合は


は、あなたがlist comprehension代わりに使用したい:

list2 = [l for l in list1] 

注意をそのリスト内包の構造との違いジェネレータの表現は、カッコではなく、角括弧[]の存在に過ぎません。

関連する問題