2016-08-21 23 views
11

Sadece çevirmenle uğraşıyordum ve anlamadığım bir şeye rastladım. Bir listeyi listeden biri olarak bir tuple oluşturduğumda ve o listeyi güncellemeye çalıştığımda tuhaf bir şey olur. Örneğin, ben çalıştırdığınızda bu:Bir tuple içindeki bir listeyi güncelleme

tup = (1,2,3,[4,5]) 
tup[3] += [6] 

alıyorum:

beklediğim tam olarak ne
TypeError: 'tuple' object does not support item assignment 

. Yine başlığın başvuru Ancak o zaman, ben alıyorum: Yani liste aslında piton bir istisna attı rağmen güncellendi

>>> tup 
(1, 2, 3, [4, 5, 6]) 

. Bu nasıl çalışıyor? Aslında böyle bir şey yapmak istediğim bir senaryo düşünemiyorum, ama hala neler olduğunu anlamak istiyorum. Teşekkür ederim.

cevap

27

Bu, aslında Python docs belgelenmiştir.

EDIT: İşte bu bir özettir, bu daha eksiksiz bir yanıttır. Biz += kullandığınızda

  1. , Python ardından sonraki öğe atamasında dönüş değeri kullanır, öğe üzerinde __iadd__ sihirli yöntemini çağırır.
  2. Listeler için, __iadd__, listedeki extend numaralı telefonu aramakla ve daha sonra listeyi döndürmekle eşdeğerdir.
  3. biz tup[3] += [6] çağırdığınızda nedenle, eşdeğerdir: İlk satır extend arayarak başarır

    result = tup[3].extend([6]) 
    tup[3] = result 
    
  4. :

    result = tup[3].__iadd__([6]) 
    tup[3] = result 
    
  5. # 2, biz bu belirleyebilir eşdeğerdir listede ve listenin değişebilir olması nedeniyle güncellenir. Ancak, sonraki atama başarısız olur, çünkü tuplelar değişmezdir ve hatayı atar.

+2

Bence bu cevap, eklentinin sadece "tup [3] .__ iadd __ ([6])' değil; tup [3] = tup [3] .__ iadd __ ([6]) 'dır. Sadece 'list .__ iadd__', mutasyona uğradığı aynı nesneyi döndürür. – zondo

+0

Dokümanlara bağlantı için teşekkürler! Bu büyük bir yardım. –

+0

Teşekkürler, bunu dokümanlarda yakalamadım. Yani bu hakkı anladığımdan emin olmak için, temelde benim örneğimde liste güncellendi çünkü ben sadece tup [3] .__ iadd __ ([6]) yapıyorum ve THEN python, tuple'daki ödev atamasını deniyor (ve başarısız oluyor). Bu yüzden başarısız olduğunu söyleyen istisnayı alıyorum, ancak bu noktada listeyi daha önce güncelledik mi? –

İlgili konular