Python'daki temel veri yapılarından biri, herhangi bir türdeki "değerleri" aramak için "anahtarları" kaydetmeye izin veren sözlüktür. Bu, dahili olarak karma tablo olarak uygulandı mı? Eğer değilse, nedir?
Python'daki temel veri yapılarından biri, herhangi bir türdeki "değerleri" aramak için "anahtarları" kaydetmeye izin veren sözlüktür. Bu, dahili olarak karma tablo olarak uygulandı mı? Eğer değilse, nedir?
Yanıtlar:
Evet, bir karma eşleme veya karma tablosu. Tim Peters tarafından yazılmış gibi, Python en dict uygulamasının tarifi okuyabilir burada .
Bu nedenle, 'kilitlenemez' bir şeyi bir liste anahtarı olarak, bir liste gibi kullanamazsınız:
>>> a = {}
>>> b = ['some', 'list']
>>> hash(b)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: list objects are unhashable
>>> a[b] = 'some'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: list objects are unhashable
Sen edebilirsiniz karma tablolar hakkında daha fazla okumak veya bu python nasıl uygulandığını kontrol ve o şekilde uygulandığına, niçin .
.keys()
bir anahtar listesi alabilirsiniz. Gerçek bir karma tablo anahtarları depolamaz, sadece yerden tasarruf etmek için karma yapar.
Bir Python sözlüğünde, hash () tablosundaki bir tablo aramasından daha fazlası olmalıdır. Kaba deneylerle bu karma çarpışmayı buldum :
>>> hash(1.1)
2040142438
>>> hash(4504.1)
2040142438
Yine de sözlüğü kırmaz:
>>> d = { 1.1: 'a', 4504.1: 'b' }
>>> d[1.1]
'a'
>>> d[4504.1]
'b'
Aklı kontrol:
>>> for k,v in d.items(): print(hash(k))
2040142438
2040142438
Muhtemelen hash () işlevinin ötesinde, sözlük anahtarları arasındaki çarpışmaları önleyen başka bir arama düzeyi daha vardır. Ya da belki dict () farklı bir karma kullanır.
(Bu arada, bu Python 2.7.10'da. Python 3.4.3 ve 3.5.0'da bir çarpışma ile aynı hikaye hash(1.1) == hash(214748749.8)
.)
hash('I wandered lonely as a cloud, that drifts on high o\'er vales and hills, when all at once, I saw a crowd, a host of golden daffodils.')
Bu, 19 basamaklı bir ondalık sayı verir - -4037225020714749784
eğer bakım için yeterince inek iseniz. Kendi kelimelerinizle devam edin, çocuklar ve hash hala 19 haneli bir sayı. Ben Python karma olabilir dize uzunluğu bir sınırı olduğunu varsayalım, ancak olası değerlerden çok daha olası dizeleri söylemek güvenli. Ve hash(False)
bu arada = 0.
Evet. Dahili olarak Z / 2 ( kaynak ) üzerinde ilkel bir polinom temel alınarak açık karma olarak uygulanır .
Nosklo'nun açıklamasını genişletmek için:
a = {}
b = ['some', 'list']
a[b] = 'some' # this won't work
a[tuple(b)] = 'some' # this will, same as a['some', 'list']
dict
uygulamasının iç kısımlarıyla ilgilidir .