2016-03-30 13 views
0

Bu iki örnek bana neden farklı çıktılar verdiğini anlamaya çalışıyorum.Neden (görünüşte) aynı kod için farklı çıktılar alıyorum?

Örnek 1:

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

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

Örnek2:

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

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

İkinci örnekte, ekleme yapılması sonrasında liste() veya tuple() koyarak denedim ama bana tek eleman veriyor 5 farklı olanın aksine yeni liste. Beni döngü için sadece bir satırını kullanarak Example1 aynı aynı çıktıyı almak için

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

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

bir yol var olabilir mi?

Herhangi bir yardım için minnettar olurum!

cevap

4

yapmak istediğiniz tüm sonra kopya list1

list2 = list1[:] 

veya

list2 = list(list1) 

o

yapacak ise İkinci örnek

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

için extend yerine append gerek

0

İkinci örnekte ek kullanmak istemezsiniz. Bunun yerine bir listeyi kopyalamak daha kolay yolları vardır

list2 = [l for l in list1] 

istiyorum, ama bu en yakın iç içe geçmiş beğenmezseniz size Örnek 2.

0

yapmak istediğimiz şeyin maçları biridir liste, basitçe kullanabilirsiniz:

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

(l for l in list1) bir generator expression olduğunu. Belli bir şekilde bellek tasarrufu sağlayan bir yineleyici (bir listeyi düşünün, ancak her öğe bellekte saklanmak yerine, her bir öğeyle birlikte döndürülür) olan bir jeneratörü açıkça döndürür. Bunu gerçekleştirmenin anahtarı, bir ifade ifadesinin, ifadenin ( ve ) tarafından geri çevrildiğini belirtmesidir.

list2.append(l for l in list1) içinde boş listeye bir tek jeneratörü eklemiş oldunuz. İstediğiniz tüm öğeleri for element in list2[0] yaparak alabilirsiniz, ancak aynı şey değildir.

Ancak

,

for l in list1: 
    list2.append(l) 

böyle jeneratör ifadeler karşılaşılan yaparken. Her yinelemede - döngünün her koşulu - l, bir element, sonuna eklenir. Bu nedenle, neden düşündüğünüz gibi çalışır.Eğer jeneratör ifadeye benzer bir şey kullanarak list2 almak istiyorsanız


, bir list comprehension yerine kullanmak istediğiniz:

list2 = [l for l in list1] 

Not bir liste anlama yapısı ve arasındaki fark jeneratör ekspresyonu sadece köşeli parantez [, ] yerine parantez varlığıdır.

İlgili konular