5 Ben Twitter bu Python pasajını gördüm ve oldukça çıkışı ile karıştı:Python Atama Operatörü Önceliği - (a, b) = a [b] = {},
>>> a, b = a[b] = {}, 5
>>> a
{5: ({...}, 5)}
burada neler oluyor ? Assignment statements documentation kaynaktan
5 Ben Twitter bu Python pasajını gördüm ve oldukça çıkışı ile karıştı:Python Atama Operatörü Önceliği - (a, b) = a [b] = {},
>>> a, b = a[b] = {}, 5
>>> a
{5: ({...}, 5)}
burada neler oluyor ? Assignment statements documentation kaynaktan
:
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 b
5
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
Hmm! Sağdan sola kademeli olarak ilerleyeceğini ve böylece bir "NameError" a, a [b] = a, b = {}, 5 'çalışmasını bekleyebilirim. – Claudiu
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
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'? –