পাইথন ডিকের একই হ্যাশ সহ একাধিক কী থাকতে পারে?


90

আমি hashহুডের নীচে পাইথন ফাংশনটি বোঝার চেষ্টা করছি । আমি একটি কাস্টম ক্লাস তৈরি করেছি যেখানে সমস্ত দৃষ্টান্ত একই হ্যাশ মান প্রদান করে।

class C:
    def __hash__(self):
        return 42

আমি কেবল ধরে নিয়েছি যে উপরের শ্রেণীর কেবলমাত্র একটি উদাহরণ dictযেকোন সময় হতে পারে তবে বাস্তবে dictএকই হ্যাশ সহ একাধিক উপাদান থাকতে পারে।

c, d = C(), C()
x = {c: 'c', d: 'd'}
print(x)
# {<__main__.C object at 0x7f0824087b80>: 'c', <__main__.C object at 0x7f0823ae2d60>: 'd'}
# note that the dict has 2 elements

আমি আরও কিছু পরীক্ষা-নিরীক্ষা করে দেখেছি যে আমি যদি __eq__ক্লাসের সমস্ত দৃষ্টান্তের সমান তুলনা করে এমন পদ্ধতিটি ওভাররাইড করি তবে dictকেবলমাত্র একমাত্র উদাহরণটিকে অনুমতি দেয়।

class D:
    def __hash__(self):
        return 42
    def __eq__(self, other):
        return True

p, q = D(), D()
y = {p: 'p', q: 'q'}
print(y)
# {<__main__.D object at 0x7f0823a9af40>: 'q'}
# note that the dict only has 1 element

সুতরাং আমি জানতে আগ্রহী যে কীভাবে কোনও dictএকই হ্যাশ সহ একাধিক উপাদান থাকতে পারে।


4
আপনি নিজের আবিষ্কার হিসাবে, সেট এবং dicts সমান হ্যাশ সহ একাধিক বস্তু থাকতে পারে যদি বস্তুগুলি তাদের সমান না হয়। তুমি কি জিজ্ঞাসা করছ? টেবিলগুলি কীভাবে কাজ করে? এটি প্রচুর বিদ্যমান সামগ্রীর সাথে একটি সাধারণ প্রশ্ন ...

@ ডেলান আমি প্রশ্ন পোস্ট করার পরে আমি এ সম্পর্কে আরও চিন্তাভাবনা করছি; যে আচরণটি পাইথনে সীমাবদ্ধ করা যায় না। এবং আপনি ঠিক বলেছেন। আমার ধারণা আমি সাধারণ হ্যাশ টেবিল সাহিত্যের আরও গভীরভাবে অনুভব করি। ধন্যবাদ
প্রবীণ গোল্লাকোটা

উত্তর:


55

পাইথনের হ্যাশিং কীভাবে কাজ করে তার বিশদ বিবরণের জন্য আমার উত্তরটি দেখুন কীভাবে তাড়াতাড়ি রিটার্ন অন্যের চেয়ে ধীর হয়?

মূলত এটি টেবিলের একটি স্লট বাছাই করতে হ্যাশ ব্যবহার করে। যদি স্লটে এবং হ্যাশের সাথে মান হয় তবে এটি আইটেমগুলির সাথে সমান কিনা তা তুলনা করে।

যদি হ্যাশটি মেলে না বা আইটেমগুলি সমান নয়, তবে এটি অন্য একটি স্লট চেষ্টা করে। এটি বাছাই করার জন্য একটি সূত্র রয়েছে (যা আমি রেফারেন্স করা উত্তরে বর্ণনা করি), এবং এটি ধীরে ধীরে হ্যাশ মানটির অব্যবহৃত অংশগুলিতে টান দেয়; তবে এটি একবারে সমস্ত ব্যবহার করার পরে, এটি শেষ পর্যন্ত হ্যাশ টেবিলের সমস্ত স্লটগুলির মধ্যে দিয়ে কাজ করবে। এই গ্যারান্টিটি শেষ পর্যন্ত আমরা হয় একটি ম্যাচিং আইটেম বা একটি খালি স্লট। যখন অনুসন্ধানটি একটি খালি স্লট সন্ধান করে, এটি মান সন্নিবেশ করে বা ছেড়ে দেয় (আমরা কোনও মান যুক্ত করছি বা পাচ্ছি তা নির্ভর করে)।

গুরুত্বপূর্ণ বিষয়টি লক্ষণীয়: কোনও তালিকা বা বালতি নেই: নির্দিষ্ট সংখ্যক স্লট সহ কেবল একটি হ্যাশ টেবিল রয়েছে এবং প্রতিটি হ্যাশ প্রার্থী স্লটের ক্রম তৈরি করতে ব্যবহৃত হয়।


7
হ্যাশ টেবিল বাস্তবায়ন সম্পর্কে সঠিক দিকে আমাকে নির্দেশ করার জন্য ধন্যবাদ। আমি হ্যাশ টেবিলগুলি সম্পর্কে যা চেয়েছিলাম তার চেয়ে অনেক বেশি পড়েছি এবং আমি আমার অনুসন্ধানগুলি পৃথক উত্তরে ব্যাখ্যা করেছি। stackoverflow.com/a/9022664/553995
প্রভীন Gollakota

112

পাইথন ডিসটিক্স সম্পর্কে এখানে যা আমি একসাথে রাখতে সক্ষম হয়েছি (সম্ভবত যে কেউ জানতে চাইবে তার চেয়ে বেশি; তবে উত্তরটি বিস্তৃত)। আউট একটি পেজে ডানকান যে পাইথন dicts স্লট ব্যবহার ইশারা এবং আমাকে নিচে নেতৃস্থানীয় এই শশকের গর্ত জন্য।

  • পাইথন অভিধানগুলি হ্যাশ টেবিল হিসাবে প্রয়োগ করা হয়
  • হ্যাশ টেবিলগুলির অবশ্যই হ্যাশ সংঘর্ষের জন্য অনুমতি দেওয়া উচিত, এমনকি যদি দুটি কীগুলির একই হ্যাশ মান থাকে, সারণীর বাস্তবায়নে অবশ্যই কী এবং মান জোড়গুলি ambোকাতে এবং পুনরুদ্ধার করার কৌশল অবশ্যই নির্বিঘ্নে থাকতে হবে।
  • পাইথন ডিক হ্যাশ সংঘর্ষের সমাধানের জন্য উন্মুক্ত ঠিকানা ব্যবহার করে (নীচে ব্যাখ্যা করা হয়েছে) ( ডিক্টোবজেক্ট .২: ২6-2-২77 দেখুন )।
  • পাইথন হ্যাশ টেবিলটি কেবল মেমরির একটি সংশ্লেষপূর্ণ ব্লক (সাজানোর ধরণের মতো, যাতে আপনি O(1)সূচী অনুসারে লক করতে পারেন )।
  • টেবিলের প্রতিটি স্লট একটি এবং কেবলমাত্র একটি এন্ট্রি সঞ্চয় করতে পারে। এটা গুরুত্বপূর্ণ
  • সারণীতে প্রতিটি এন্ট্রি আসলে তিনটি মানের সমন্বয় -। এটি সি স্ট্রাক্ট হিসাবে প্রয়োগ করা হয়েছে (দেখুন ডিক্টবোজেক্ট h: 51-56 )
  • নীচের চিত্রটি একটি পাইথন হ্যাশ টেবিলের যৌক্তিক উপস্থাপনা। নীচের চিত্রটিতে, 0, 1, ..., i, ... বামদিকে হ্যাশ টেবিলের স্লটগুলির সূচক রয়েছে (এগুলি কেবল উদাহরণস্বরূপ উদ্দেশ্যে রয়েছে এবং টেবিলের সাথে স্পষ্টত সংরক্ষণ করা হয় না!)।

    # Logical model of Python Hash table
    -+-----------------+
    0| <hash|key|value>|
    -+-----------------+
    1|      ...        |
    -+-----------------+
    .|      ...        |
    -+-----------------+
    i|      ...        |
    -+-----------------+
    .|      ...        |
    -+-----------------+
    n|      ...        |
    -+-----------------+
    
  • নতুন ডিক শুরু হলে এটি 8 টি স্লট দিয়ে শুরু হয় । (দেখা ডিক্টোবজেক্ট দেখুন: 49 )

  • টেবিলে এন্ট্রি যুক্ত করার সময়, আমরা কিছু স্লট দিয়ে শুরু করি i, এটি কী এর হ্যাশের উপর ভিত্তি করে। সিপিথন প্রাথমিক ব্যবহার করে i = hash(key) & mask। কোথায় mask = PyDictMINSIZE - 1, তবে এটি সত্যই গুরুত্বপূর্ণ নয়)। কেবলমাত্র লক্ষ করুন যে প্রাথমিক স্লট, i, যাচাই করা হয়েছে কীটির হ্যাশের উপর নির্ভর করে ।
  • যদি সেই স্লটটি খালি থাকে, স্লটটিতে এন্ট্রি যুক্ত করা হবে (এন্ট্রি দ্বারা, মানে, <hash|key|value> ) । তবে কী যদি সেই স্লটটি দখল করা হয় !? সম্ভবত সম্ভবত অন্য এন্ট্রিতে একই হ্যাশ রয়েছে (হ্যাশ সংঘর্ষ!)
  • স্লটটি যদি দখল করা থাকে তবে সিপিথন (এবং পিপিপি) হ্যাশ এবং কী (তুলনা করে আমি ==তুলনা নয় মানে তুলনা করে is) বর্তমান সন্নিবেশকৃত কীটির বিপরীতে প্রবেশের কীটির সাথে তুলনা করে ( ডিক্টবজেক্ট.সি: 337 , 344-345 )। যদি উভয়ই মিলে যায়, তবে এটি মনে করে যে এন্ট্রিটি ইতিমধ্যে বিদ্যমান রয়েছে, ছেড়ে দেয় এবং entryোকানোর জন্য পরবর্তী প্রবেশিকায় এগিয়ে যায়। যদি হ্যাশ বা কীটি মেলে না, এটি অনুসন্ধান শুরু করে ।
  • অনুসন্ধানের অর্থ হ'ল এটি খালি স্লট স্লট দ্বারা স্লটগুলি সন্ধান করে। প্রযুক্তিগতভাবে আমরা কেবল একের পর এক যেতে পারি, i + 1, i + 2, ... এবং প্রথম উপলব্ধ একটি ব্যবহার করতে পারি (এটি লিনিয়ার প্রোবিং)। তবে কারণগুলিতে মন্তব্যগুলিতে সুন্দরভাবে ব্যাখ্যা করা হয়েছে (দেখুন ডিক্টোবজেক্ট.সি: ৩৩-১২6 ), সিপিথন এলোমেলো প্রোবিং ব্যবহার করে । এলোমেলো অনুসন্ধানে, পরবর্তী স্লটটি সিউডো এলোমেলো ক্রমে বেছে নেওয়া হয়েছে। প্রথম খালি স্লটে এন্ট্রি যুক্ত করা হয়। এই আলোচনার জন্য, পরবর্তী স্লটটি বাছাইয়ের জন্য ব্যবহৃত প্রকৃত অ্যালগরিদমটি সত্যই গুরুত্বপূর্ণ নয় ( অনুসন্ধানের জন্য অ্যালগরিদমের জন্য ডিক্টোবজেক্ট.সি: ৩৩-১২6 দেখুন )। গুরুত্বপূর্ণটি হ'ল প্রথম খালি স্লট না পাওয়া পর্যন্ত স্লটগুলি তদন্ত করা হবে।
  • অনুসন্ধানের ক্ষেত্রে একই জিনিস ঘটে, কেবল প্রাথমিক স্লট আই (যেখানে আমি কীটির হ্যাশের উপর নির্ভরশীল) দিয়ে শুরু হয়। যদি হ্যাশ এবং কী উভয় স্লটে প্রবেশের সাথে মেলে না, তবে এটি অনুসন্ধান করা শুরু করবে, যতক্ষণ না এটি কোনও ম্যাচের সাথে স্লট খুঁজে পায়। সমস্ত স্লট ক্লান্ত হয়ে গেলে, এটি একটি ব্যর্থতার রিপোর্ট করে।
  • বিটিডাব্লু, ডিকটি দুই-তৃতীয়াংশ পূর্ণ হলে পুনরায় আকার দেওয়া হবে। এটি অনুসন্ধানগুলিকে আস্তে আস্তে এড়িয়ে যায়। ( ডিক্টোবজেক্ট দেখুন: -৪-65৫ )

এই নাও! ==আইটেম সন্নিবেশ করানোর সময় ডিকের পাইথন বাস্তবায়ন দুটি কীগুলির উভয় হ্যাশ সমতা এবং কীগুলির স্বাভাবিক সমতা ( ) পরীক্ষা করে। সুতরাং সংক্ষেপে, যদি দুটি কী থাকে aএবং bএবং hash(a)==hash(b), তবে a!=b, তবে উভয়ই পাইথন ডিকটিতে সুরেলাভাবে থাকতে পারে। তবে hash(a)==hash(b) এবং যদি a==b, তবে তারা উভয়ই একই আদেশে থাকতে পারে না।

যেহেতু প্রতিটি হ্যাশের সংঘর্ষের পরে আমাদের তদন্ত করতে হবে, অনেকগুলি হ্যাশের সংঘর্ষের একটি পার্শ্ব প্রতিক্রিয়া হ'ল লুক্কুট এবং সন্নিবেশগুলি খুব ধীর হয়ে উঠবে (যেমন ডানকান মন্তব্যে উল্লেখ করেছেন) )।

আমার অনুমানটি আমার প্রশ্নের সংক্ষিপ্ত উত্তর হ'ল, "কারণ এটি উত্স কোডে এটি কার্যকর হয়;)"

যদিও এটি জেনে রাখা ভাল (জিক পয়েন্টগুলির জন্য?), তবে সত্যিকার অর্থে এটি কীভাবে ব্যবহার করা যায় তা আমি নিশ্চিত নই। কারণ আপনি যদি স্পষ্টভাবে কিছু ভাঙার চেষ্টা না করেন তবে দুটি বস্তু যে সমান নয়, কেন একই হ্যাশ থাকবে?


8
এটি ব্যাখ্যা করে কিভাবে অভিধান পূরণ করা কাজ করে। তবে কী_মূল্য জোড়াটি পুনরুদ্ধারের সময় যদি হ্যাশের সংঘর্ষ হয়। বলুন যে আমাদের কাছে দুটি এবং এ এবং বি দুটি বস্তু রয়েছে যা উভয়ই হ্যাশ 4 হয়। সুতরাং প্রথম এটিকে স্লট 4 বরাদ্দ করা হবে এবং তারপরে বি এলোমেলো প্রোবিংয়ের মাধ্যমে স্লট বরাদ্দ করা হবে। আমি বি বি থেকে ৪ টি পুনরুদ্ধার করতে চাইলে কী ঘটে তাই পাইথন প্রথমে ৪ নম্বর স্লট পরীক্ষা করে তবে কীটি মেলে না এটি এ ফিরে আসতে পারে না কারণ বি এর স্লটটি এলোমেলো অনুসন্ধানের দ্বারা নির্ধারিত হয়েছিল, কিভাবে বি আবার ফিরে আসবে ও (1) সময়ে?
sayantankhan

4
@ বোল্ট 64 এলোমেলো অনুসন্ধানের ঘটনাটি এলোমেলো নয়। একই মূল মানগুলির জন্য এটি সর্বদা প্রোবের একই ক্রম অনুসরণ করে যাতে অবশেষে এটি বি খুঁজে পাবে D ডিকশনারিগুলিকে ও (1) হওয়ার গ্যারান্টি দেওয়া হয় না, যদি আপনি প্রচুর সংঘর্ষ পান তবে তারা আরও সময় নিতে পারে। পাইথনের পুরানো সংস্করণগুলির সাথে এমন একগুলি কী তৈরি করা সহজ যা সংঘর্ষে পড়বে এবং সেক্ষেত্রে অভিধানের অনুসন্ধানগুলি ও (এন) হয়ে যায়। এটি ডস আক্রমণের সম্ভাব্য ভেক্টর তাই নতুন পাইথন সংস্করণগুলি ইচ্ছাকৃতভাবে এটি করা আরও কঠিন করার জন্য হ্যাশিংটি পরিবর্তন করে।
ডানকান

4
@ ডানকান কী হবে যদি এ মুছে ফেলা হয় এবং তারপরে আমরা বি তে একটি অনুসন্ধান করব? আমার ধারণা আপনি আসলে এন্ট্রি মুছবেন না তবে সেগুলি মুছে ফেলা হিসাবে চিহ্নিত করবেন? এর অর্থ হ'ল ডিক্টগুলি ধারাবাহিক সন্নিবেশ এবং মোছার জন্য উপযুক্ত নয় ....
Gen-ys

4
@ জেন-ওয়াস হ্যাঁ মুছে ফেলা এবং অব্যবহৃত হ'ল দেখার জন্য আলাদাভাবে পরিচালনা করা হয়। অব্যবহৃত একটি মিলের জন্য অনুসন্ধান থামায় কিন্তু মুছে ফেলা হয় না। সন্নিবেশ করলে মুছে ফেলা বা অব্যবহৃত হয় খালি স্লট হিসাবে ব্যবহার করা যেতে পারে যা ব্যবহার করা যেতে পারে। অবিচ্ছিন্ন সন্নিবেশ এবং মুছে ফেলা ভাল। যখন অব্যবহৃত (মুছে ফেলা হয়নি) স্লটগুলির সংখ্যা খুব কম হয়ে যায় তখন হ্যাশ টেবিলটি একইভাবে পুনর্নির্মাণ করা হবে যেন বর্তমান সারণির জন্য এটি অনেক বড় হয়ে গেছে।
ডানকান

4
ডানকান যে সংঘর্ষ পয়েন্টটি প্রতিকার করার চেষ্টা করেছিলেন তার পক্ষে এটি খুব ভাল উত্তর নয়। এটি আপনার প্রশ্ন থেকে বাস্তবায়নের জন্য উল্লেখের জন্য বিশেষত দুর্বল উত্তর। এটি বোঝার মূল বিষয়টি হ'ল যদি কোনও সংঘর্ষ হয় তবে পাইথন হ্যাশ টেবিলের পরবর্তী অফসেট গণনা করার জন্য একটি সূত্র ব্যবহার করে আবার চেষ্টা করে। পুনরুদ্ধারের সময় কীটি একই নয় তবে পরবর্তী অফসেট সন্ধান করতে এটি একই সূত্রটি ব্যবহার করে। এটি সম্পর্কে এলোমেলো কিছুই নেই।
ইভান ক্যারল

20

সম্পাদনা করুন : নীচের উত্তরটি হ্যাশের সংঘর্ষগুলির সাথে মোকাবিলা করার অন্যতম সম্ভাব্য উপায়, পাইথন এটি কীভাবে তা করে তবে তা নয়। নীচে পাইথনের উইকি রেফারেন্সও ভুল। নীচে @ ডানকান দ্বারা প্রদত্ত সেরা উত্সটি হ'ল বাস্তবায়ন: https://github.com/python/cpython/blob/master/Objects/dictobject.c এই মিশ্রণের জন্য আমি ক্ষমাপ্রার্থী।


এটি হ্যাশটিতে উপাদানগুলির একটি তালিকা (বা বালতি) সংরক্ষণ করে তারপরে সেই তালিকাটির মাধ্যমে পুনরাবৃত্তি হয় যতক্ষণ না এটি তালিকায় আসল কীটি খুঁজে পায়। একটি ছবি হাজার হাজার শব্দের চেয়ে বেশি বলে:

হ্যাশ টেবিল

এখানে আপনি John Smithএবং Sandra Deeউভয় হ্যাশ দেখতে 152। বালতিতে 152উভয়ই রয়েছে। যখন আপ খুঁজছেন Sandra Deeএটা প্রথম বালতি তালিকায় খুঁজে বের করে 152, তখন পর্যন্ত যে তালিকা মাধ্যমে loops Sandra Deeপাওয়া যায় এবং আয়521-6955

নিম্নলিখিত ভুল এটি শুধুমাত্র এখানে প্রসঙ্গ জন্য: উপর পাইথন এর উইকি কেমন পাইথন লুকআপ সঞ্চালিত (? ছদ্ম) কোড খুঁজে পেতে পারেন।

এই সমস্যার আসলে বেশ কয়েকটি সম্ভাব্য সমাধান রয়েছে, একটি সুন্দর ওভারভিউয়ের জন্য উইকিপিডিয়া নিবন্ধটি দেখুন: http://en.wikedia.org/wiki/Hash_table#Collision_resolution


ব্যাখ্যার জন্য এবং বিশেষত সিউডো কোডের সাথে পাইথন উইকির প্রবেশের লিঙ্কটির জন্য ধন্যবাদ!
প্রবীণ গোল্লকোটো

4
দুঃখিত, তবে এই উত্তরটি কেবল সাধারণ ভুল (উইকের নিবন্ধটিও তাই)। পাইথন হ্যাশটিতে উপাদানগুলির একটি তালিকা বা বালতি সঞ্চয় করে না: এটি হ্যাশ টেবিলের প্রতিটি স্লটে যথাযথভাবে একটি বস্তু সঞ্চয় করে। এটি যে স্লটটিকে প্রথমে ব্যবহারের চেষ্টা করে তা যদি দখল করা থাকে তবে এটি অন্য স্লটটি বেছে নেয় (যতক্ষণ সম্ভব হ্যাশের অব্যবহৃত অংশগুলিতে টানছে) এবং তারপরে আরেকটি এবং অন্যটি। যেহেতু কোনও হ্যাশ টেবিল এক তৃতীয়াংশের বেশি পূর্ণ নয় এটি অবশেষে একটি উপলভ্য স্লট সন্ধান করতে হবে।
ডানকান

@ ডানকান, পাইথনের উইকি বলেছেন যে এটি এভাবে প্রয়োগ করা হয়েছে। আমি একটি ভাল উত্স খুঁজে পেয়ে খুশি হবে। উইকিপিডিয়া.অর্গ পৃষ্ঠাগুলি অবশ্যই স্পষ্টত ভুল নয়, যেমনটি বলা হয়েছে এটি সম্ভাব্য সমাধানগুলির মধ্যে একটি মাত্র।
রব ওয়াউটার 21

@ ডানকান আপনি কি দয়া করে ব্যাখ্যা করতে পারবেন ... যতক্ষণ সম্ভব হ্যাশের অব্যবহৃত অংশগুলিতে টানছেন? সকল আমার ক্ষেত্রে হ্যাশ করার 42. ধন্যবাদ মূল্যায়ন!
প্রবীণ গোল্লাকোটা

@ প্রবীণগোলকোটা আমার উত্তরের লিঙ্কটি অনুসরণ করুন, যা হ্যাশটি কীভাবে ব্যবহৃত হয় তা বিশদভাবে ব্যাখ্যা করে। ৪২ এর একটি হ্যাশ এবং 8 টি স্লট সহ একটি টেবিলের জন্য প্রথমে স্লট সংখ্যা 2 খুঁজে পেতে কেবল সর্বনিম্ন 3 টি বিট ব্যবহৃত হয় তবে যদি সেই স্লটটি ইতিমধ্যে ব্যবহৃত হয় তবে বাকি বিটগুলি খেলতে আসে। যদি দুটি মানগুলির ঠিক একই হ্যাশ থাকে তবে প্রথমে প্রথম স্লটে চেষ্টা করা হয় এবং দ্বিতীয়টি পরবর্তী স্লট পায়। যদি অভিন্ন হ্যাশ সহ 1000 মান থাকে তবে আমরা মানটি সন্ধান করার আগে আমরা 1000 স্লট ব্যবহার করে শেষ করব এবং অভিধানের অনুসন্ধানটি খুব ধীর হয়ে যায়!
ডানকান

4

হ্যাশ টেবিলগুলি, সাধারণভাবে হ্যাশের সংঘর্ষের জন্য অনুমতি দিতে হয়! আপনি দুর্ভাগ্য পাবেন এবং দুটি জিনিস অবশেষে একই জিনিসটিতে হ্যাশ করবে। নীচে, আইটেমগুলির তালিকায় একটি সামগ্রীর একটি সেট রয়েছে যা একই হ্যাশ কী রয়েছে। সাধারণত, সেই তালিকায় কেবল একটি জিনিস রয়েছে তবে এই ক্ষেত্রে এটি তাদের একই স্ট্যাক করে রাখবে। একমাত্র উপায় যা তারা জানত তা হল সমান অপারেটরের মাধ্যমে।

যখন এটি ঘটে তখন আপনার পারফরম্যান্স সময়ের সাথে সাথে হ্রাস পাবে, এ কারণেই আপনি চান যে আপনার হ্যাশ ফাংশনটি "যথাসম্ভব এলোমেলো" হওয়া উচিত।


2

থ্রেডে আমি দেখতে পেলাম না যে একটি ব্যবহারকারী-সংজ্ঞায়িত শ্রেণীর উদাহরণ দিয়ে অজগরটি ঠিক কী করে যখন আমরা এটি একটি কী হিসাবে অভিধানে রাখি। আসুন কিছু ডকুমেন্টেশন পড়ুন: এটি ঘোষণা করে যে কেবলমাত্র হ্যাশযোগ্য বস্তুগুলি কী হিসাবে ব্যবহার করা যেতে পারে। হ্যাশেবল হ'ল সমস্ত স্থায়ী অন্তর্নির্মিত ক্লাস এবং সমস্ত ব্যবহারকারী-সংজ্ঞায়িত শ্রেণি।

ব্যবহারকারী-সংজ্ঞায়িত শ্রেণিতে ডিফল্টরূপে __cmp __ () এবং __hash __ () পদ্ধতি রয়েছে; তাদের সাথে সমস্ত বস্তু অসম (নিজের সাথে বাদে) এবং x .__ হ্যাশ __ () আইডি (এক্স) থেকে প্রাপ্ত ফলাফল প্রদান করে returns

সুতরাং আপনার ক্লাসে যদি নিয়মিত __hash__ থাকে তবে কোনও __cmp__ বা __eq__ পদ্ধতি সরবরাহ না করা থাকে, তবে আপনার সমস্ত উদাহরণ অভিধানের জন্য অসম। অন্যদিকে, আপনি যদি কোনও __cmp__ বা __eq__ পদ্ধতি সরবরাহ করে তবে __hash__ সরবরাহ না করেন তবে অভিধানের ক্ষেত্রে আপনার দৃষ্টান্তগুলি এখনও অসম।

class A(object):
    def __hash__(self):
        return 42


class B(object):
    def __eq__(self, other):
        return True


class C(A, B):
    pass


dict_a = {A(): 1, A(): 2, A(): 3}
dict_b = {B(): 1, B(): 2, B(): 3}
dict_c = {C(): 1, C(): 2, C(): 3}

print(dict_a)
print(dict_b)
print(dict_c)

আউটপুট

{<__main__.A object at 0x7f9672f04850>: 1, <__main__.A object at 0x7f9672f04910>: 3, <__main__.A object at 0x7f9672f048d0>: 2}
{<__main__.B object at 0x7f9672f04990>: 2, <__main__.B object at 0x7f9672f04950>: 1, <__main__.B object at 0x7f9672f049d0>: 3}
{<__main__.C object at 0x7f9672f04a10>: 3}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.