2016-02-25 23 views
6

Bu sorular PEP 448 -- Additional Unpacking Generalizations kaynaklanıyor ve bildiğim kadarıyla farkında (ve 2.x için arka Taşınmamış) değilim gibi Python 3.5 bulunur atama deyiminin sağ tarafındaki vs solda operatörü. ,Yıldız *

elements nedenleri *elements, = iterable iken bir list, elements = *iterable olduğu bir tuple olmak elements neden olur: Spesifik olarak, bölüm dezavantajları olarak aşağıdaki not edilir. Bunun nedeni, insanları yapıya aşina değil.

gerçekten iterable = [1, 2, 3, 4] için, tutun nedir

, ilk dava verir bir list:

>>> *elements, = iterable 
>>> elements 
[1, 2, 3, 4] 

iken bir tuple oluşturulur ikinci durum için:

>>> elements = *iterable, 
>>> elements 
(1, 2, 3, 4) 

kavramı ile yabancı olmak , Kafam karıştı. Bu davranışı herkes açıklayabilir mi? Yıldızlı ifade, bulunduğu tarafa bağlı olarak farklı davranır mı?

cevap

6

de dikkate uzun açma için başlangıç ​​PEP çekerken, bu iki durum arasındaki fark açıklanmıştır: PEP 3132 -- Extended iterable unpacking.

Bu PEP bir liste atanacaktır bir "catch-all" adını belirtmek için izin sözdizimi açma iterable için bir değişiklik önermektedir: Biz görüyoruz ki PEP için Özet olarak

tüm öğelerin "normal" adıyla atanmamış.

(vurgu benim) İlk durumda Yani

, yürüttükten sonra:

elements

*elements, = iterable 
daima tüm öğeleri içeren bir list olacak iterable.

Her iki durumda da benzer görünse de, bu durumda * (sol taraf), bir ada sahip olmayan her şeyi yakalar ve onu yıldızlı ifadeye atar. Bu *args olarak benzer bir şekilde çalışır ve **kwargsfonksiyon tanımlarında yapmak.

def spam(*args, **kwargs): 
    """ args and kwargs group positional and keywords respectively """ 

ikinci durumda (sağ taraf) biraz farklıdır. Burada biz fonksiyon çağırır içinde genellikle gibi bu çalışma var kadar bir "her şeyi yakalamak" şekilde çalışan * yok. Bağlı olduğu yinelenebilir içeriğin içeriğini genişletir.Yani, deyim: Bir tuple başlatılması için başka bir yol ise

elements = 1, 2, 3, 4, 

:

elements = *iterable, 

olarak görülebilir.

Do not, bir list[] içinde iterable içeriğini açmak ve form elements = [1, 2, 3, 4] bir atamaları ile sonuçlanacaktır hangi elements = [*iterable] kullanarak basit oluşturulabilir.

İlgili konular