python - لغة - كود بايثون




ماذا تقصد قابل للغسل في بايثون؟ (5)

حاولت البحث في الإنترنت ولكن لم أتمكن من العثور على معنى قابل للغسل.

عندما يقولون أشياء قابلة hashable أو hashable objects ماذا يعني ذلك؟


جميع الإجابات هنا لديها شرح جيد للعمل للكائنات القابلة للغسل في python ، ولكن أعتقد أن المرء يحتاج إلى فهم مصطلح Hashing أولاً.

Hashing هو مفهوم في علوم الكمبيوتر يستخدم لإنشاء هياكل بيانات الوصول العشوائي عالية الأداء ، حيث يتم تخزين كمية كبيرة من البيانات والوصول إليها بسرعة.

على سبيل المثال ، إذا كان لديك 10000 رقم هاتف ، وكنت تريد تخزينها في مصفوفة (وهي بنية بيانات تسلسلية تقوم بتخزين البيانات في مواقع الذاكرة المتجاورة ، وتوفر الوصول العشوائي) ، ولكن قد لا يكون لديك المقدار المطلوب من الاتصال مواقع الذاكرة.

لذلك ، يمكنك بدلاً من ذلك استخدام صفيف بحجم 100 ، واستخدام دالة هاش لتعيين مجموعة من القيم على نفس الفهارس ، ويمكن تخزين هذه القيم في قائمة مرتبطة. هذا يوفر أداء مشابه لمصفوفة.

الآن ، يمكن أن تكون دالة هاش بسيطة مثل قسمة الرقم على حجم الصفيف وأخذ الباقي كمؤشر.

لمزيد من التفاصيل ، راجع https://en.wikipedia.org/wiki/Hash_function

في ما يلي مرجع جيد آخر: http://interactivepython.org/runestone/static/pythonds/SortSearch/Hashing.html


حسب فهمي لـ Python glossary ، عندما تقوم بإنشاء مثيل من الكائنات القابلة للغسل ، يتم أيضًا حساب قيمة غير قابلة للتغيير وفقًا لأعضاء أو قيم المثيل. على سبيل المثال ، يمكن استخدام هذه القيمة كمفتاح في dict كما يلي:

>>> tuple_a = (1,2,3)
>>> tuple_a.__hash__()
2528502973977326415
>>> tuple_b = (2,3,4)
>>> tuple_b.__hash__()
3789705017596477050
>>> tuple_c = (1,2,3)
>>> tuple_c.__hash__()
2528502973977326415
>>> id(a) == id(c)  # a and c same object?
False
>>> a.__hash__() == c.__hash__()  # a and c same value?
True
>>> dict_a = {}
>>> dict_a[tuple_a] = 'hiahia'
>>> dict_a[tuple_c]
'hiahia'

يمكننا أن نجد أن قيمة تجزئة tuple_a و tuple_c هي نفسها لأنها تحتوي على نفس الأعضاء. عندما نستخدم tuple_a كمفتاح في dict_a ، يمكننا أن نجد أن قيمة dict_a [tuple_c] هي نفسها ، مما يعني أنه عندما يتم استخدامها كمفتاح في الأمر ، فإنها تعيد نفس القيمة لأن قيم التجزئة نفس الشيء. بالنسبة لتلك الكائنات غير القابلة للغسل ، يتم تعريف التجزئة بطريقة بلا:

>>> type(dict.__hash__) 
<class 'NoneType'>

أعتقد أن قيمة التجزئة هذه يتم حسابها عند تهيئة المثيل ، وليس بطريقة ديناميكية ، ولهذا السبب فإن الأشياء القابلة للتغيير فقط قابلة للغسل. أتمنى أن يساعدك هذا.



في python ، يعني ذلك أن الكائن يمكن أن يكون أعضاءًا في مجموعات من أجل إرجاع فهرس. أي ، لديهم هوية / معرف فريد.

على سبيل المثال ، في python 3.3:

بنية البيانات لا يمكن إدراج القوائم القابلة للغسيل ولكن هيكل البيانات قابل للغسل.


يمكن تجزئة أي شيء غير قابل للتحويل (وسائل قابلة للتغيير ، من المحتمل أن تتغير). إلى جانب وظيفة البعثرة التي تبحث عنها ، إذا كانت هناك فئة ، على سبيل المثال. dir(tuple) وتبحث عن طريقة __hash__ ، إليك بعض الأمثلة

#x = has(set([1,2])) #set unhashable
x = hash(frozenset([1,2])) #hashable
#x = hash(([1,2], [2,3])) #tuple of mutable objects, unhashable
x = hash((1,2,3)) #tuple of immutable objects, hashable
#x = hash()
#x = hash({1,2}) #list of mutable objects, unhashable
#x = hash([1,2,3]) #list of immutable objects, unhashable

قائمة الأنواع القابلة للتغيير:

int, float, decimal, complex, bool, string, tuple, range, frozenset, bytes

قائمة الأنواع القابلة للتغيير:

list, dict, set, bytearray, user-defined classes




python