2014-04-24 21 views
7

Yani listeleri unhashable şunlardır:Listeleri ne derece şaşırtmıyor?

>>> { [1,2]:3 } 
TypeError: unhashable type: 'list' 

page aşağıdaki açıklama verir:

listesi bir değişken türüdür ve sözlükten bir anahtar olarak kullanılamaz (içeri değiştirebilir -anahtarın artık sözlükte dahili karma tablosunda bulunabilmesi). o Sözlük tuşları olarak değiştirilebilen elemanlardan kullanmak istenmeyen neden

anlıyorum. Ancak, Python ben sadece

>>> hash([1,2]) 
TypeError: unhashable type: 'list' 

mu Python değiştirilebilir tipler sözlüğü tuşları olarak asla kullanılmayacaktır bir garantisi olarak bunu (bağımsız sözlük yaratılış) listesini karma çalışıyorum hatta aynı istisna yükseltir? Yoksa bunları nasıl kullanmayı planladığımı dikkate almadan, değişebilir nesneleri karma imkansız kılan başka bir neden var mı?

+2

'karma()' basitçe nesnenin '__hash__' yöntemini çağırır ve bu dicts yaptıklarının aynısı bu. –

+1

Ne * yapma * karma ile yapmayı planlıyorsunuz? Motivasyon, bir nesnenin karma değerinin değişmemesi ve eşit nesnelerin genel olarak aynı kalmamasıdır. – geoffspear

cevap

17

Sözlükler ve kümeler, bir öğeyi benzersiz olarak belirlemek için karma algoritmalar kullanır. Ve bu algoritmalar, benzersiz karma değerini bulmak için anahtar olarak kullanılan öğeleri kullanır. Listeler değişebilir olduğundan, bir listenin içeriği değişebilir. Bir listenin bir anahtar olarak bir sözlükte bulunmasına izin verdikten sonra, listenin içeriği değişirse, karma değeri de değişecektir. Karma değeri, sözlükteki belirli bir yuvaya depolandıktan sonra değişirse, tutarsız bir sözlüğe yol açar. Örneğin, başlangıçta liste, hash değerine göre belirlenen A konumunda depolanmış olurdu. Karma değeri değişirse ve listeyi ararsak, A konumunda bulamayabilirsek veya yeni karma değerine göre başka bir nesne bulabiliriz.

Bir karma değer bulmak mümkün olmadığından, dahili olarak no hashing function defined for lists bulunmaktadır. Eğer sözlükte bir anahtar olarak kullanmak veya zorla hash fonksiyonu ile karma değerini elde etmeye çalışmak zaman karma işlevi olarak

PyObject_HashNotImplemented,    /* tp_hash */ 

, uygulanmadı, onu karma başarısız ve bu yüzden unhashable türü ile başarısız

TypeError: unhashable type: 'list'