Python'daki listeler için append() ve extend() yöntemleri eleman eklemek için kullanılır, ancak bunu prensipte farklı şekillerde yaparlar:
append(obj) bir öğe (herhangi bir nesne — bir liste de dahil) mevcut listenin sonuna ekler.extend(iterable) tüm öğeleri bir iterable nesne içerisinden tek tek ekler (eklendiğinde onun "açılması" gibi).Örnek:
lst = [1, 2, 3] lst.append([4, 5]) # Sonuç: [1, 2, 3, [4, 5]] lst = [1, 2, 3] lst.extend([4, 5]) # Sonuç: [1, 2, 3, 4, 5]
Bu farklılık, "düz" bir liste beklenirken iç içe geçmiş olanların elde edilmesi nedeniyle sıkça mantıksal hatalara neden olur.
Eğer
list1 = [1, 2]; list2 = [3, 4]; list1.append(list2)yaparsak, list1 nasıl görünür?list1.extend(list2)ile farkı nedir?
Cevap:
list1.append(list2) sonrası sonuç: [1, 2, [3, 4]] — ikinci liste bir öğe olarak (iç içe liste) eklenmiştir.list1.extend(list2) sonrası sonuç: [1, 2, 3, 4] — ikinci listenin elemanları "açılmış" ve ayrı öğeler olarak eklenmiştir.Hikaye
Bir geliştirici birkaç dosyadan parsing sonuçlarını birleştirirken
output.append(parsed_lines)yaptı. Sonuç olarak, uzun düz bir liste yerine dosyaların her biri için bir öğe olan listeler listesi aldı, bu da tüm sonraki işlemleri kırdı — özellikle, satır dizisi bekleyen fonksiyonlar, giriş verilerinde hatalar vermeye başladı.
Hikaye
Projede "foo" biçiminde bir dize eklemek için extend kullanıldı (yani dize iterable olarak düşünüldü). Sonuç olarak, dizenin harfleri liste içinde ayrı öğeler haline geldi:
['f', 'o', 'o']yerine istenen "foo".
Hikaye
JSON'a veri iletmek için veri serileştirilirken, sonucu listeye eklemek için döngüde append/extend kullanıldı, farkın anlaşılmaması sonucunda yapıların şemayı ihlal eden yapılar elde edildi ve bazı mikro hizmetler doğrulama aşamasında çökmesine veya hatalı çalışmasına neden oldu.