2015-08-20 41 views

cevap

17

:

bir atama deyimi sentezleme listesi (bu, tek bir sentezleme veya bir virgül ile ayrılmış liste, bir demet elde ikinci olabilir unutmayın) değerlendirir ve sonuçta elde edilen tek nesneyi atar Hedef listelerin her biri, soldan sağa.

İki atama hedef listeniz var; a, b ve a[b], {}, 5 değeri, soldan sağa doğru bu iki hedefe atanır.

İlk olarak {}, 5 tuple a, b paketinden kaldırılır. Artık a = {} ve b = 5 var. {}'un değiştirilebileceğini unutmayın.

Sonra a sözlüğe değerlendirir ve b5 olarak değerlendirilirse a[b], aynı sözlüğü ve tamsayı atamak, yani döngüsel bir başvuru oluşturarak tuplea ({}, 5) için sözlükte anahtar 5 ayarlıyorsunuz. Bu nedenle {...}, a'un zaten referans aldığı aynı nesneyi ifade eder. atama soldan sağa yer aldığından

, sen bu ayırabiliriz:

a, b = {}, 5 
a[b] = a, b 

yüzden a[b][0]a aynı nesnedir: Python için şaşırtıcı unintuitive var

>>> a, b = {}, 5 
>>> a[b] = a, b 
>>> a 
{5: ({...}, 5)} 
>>> a[b][0] is a 
True 
+4

Hmm! Sağdan sola kademeli olarak ilerleyeceğini ve böylece bir "NameError" a, a [b] = a, b = {}, 5 'çalışmasını bekleyebilirim. – Claudiu

+0

Mükemmel cevap. Göndermeden önce neler olduğunu anladım ve bir cevap göndermeyi planlıyordum, ama çok iyi cevap verdin. Ayrıca, a [b] [0] için +1 bir a'dır. – Andrew

+0

Güzel cevap! Ancak, dokümanlar, hedef listelerin her birine ** tek bir sonuç nesnesini ** atarlar, soldan sağa doğru, yani a, b = {}, 5; a [b] = {}, 5'? –