পাইথন ==
এবং এর is
মধ্যে পার্থক্য আছে ?
হ্যাঁ, তাদের মধ্যে একটি খুব গুরুত্বপূর্ণ পার্থক্য রয়েছে।
==
: সমতার জন্য যাচাই করুন - শব্দার্থবিজ্ঞান হ'ল সমমানের অবজেক্টগুলি (যেগুলি অবশ্যই একই বস্তু নয়) সমান হিসাবে পরীক্ষা করবে। ডকুমেন্টেশন যেমন বলে :
অপারেটর <,>, ==,> =, <=, এবং! = দুটি বস্তুর মান তুলনা করুন।
is
: পরিচয় পরীক্ষা করুন - শব্দার্থবিজ্ঞান হ'ল বস্তুটি (মেমরিরূপে রাখা) বস্তু। আবার, ডকুমেন্টেশন বলে :
অপারেটার is
এবং is not
বস্তুর পরিচয়ের জন্য পরীক্ষা: x is y
যদি এবং কেবল যদি সত্য x
এবং y
একই বস্তুর হয়। id()
ফাংশনটি ব্যবহার করে অবজেক্টের পরিচয় নির্ধারণ করা হয় । x is not y
বিপরীত সত্যের মান দেয়।
সুতরাং, পরিচয়ের জন্য যাচাই করা অবজেক্টগুলির আইডির সমতার জন্য পরীক্ষা করার সমান as এটাই,
a is b
হিসাবে একই:
id(a) == id(b)
id
বিল্টিন ফাংশনটি যেখানে পূর্ণসংখ্যা ফেরত দেয় যা "একই সাথে বিদ্যমান বস্তুর মধ্যে অনন্য হওয়ার গ্যারান্টিযুক্ত" (দেখুন help(id)
) এবং কোথায় a
এবং b
যেকোন স্বেচ্ছাসেবী অবজেক্টগুলি।
অন্যান্য ব্যবহারের দিকনির্দেশ
শব্দার্থকগুলির জন্য আপনার এই তুলনাগুলি ব্যবহার করা উচিত। is
পরিচয় যাচাই করতে এবং ==
সমতা পরীক্ষা করতে ব্যবহার করুন ।
সুতরাং সাধারণভাবে, আমরা is
পরিচয় পরীক্ষা করার জন্য ব্যবহার করি । এটি সাধারণত তখন কার্যকর হয় যখন আমরা এমন কোনও বস্তুর জন্য যাচাই করি যা মেমরির মধ্যে কেবল একবার উপস্থিত থাকতে পারে, যা ডকুমেন্টেশনে "সিঙ্গলটন" হিসাবে উল্লেখ করা হয়।
is
অন্তর্ভুক্তগুলির জন্য কেসগুলি ব্যবহার করুন :
None
- এনাম মান (এনাম মডিউল থেকে এনামস ব্যবহার করার সময়)
- সাধারণত মডিউল
- সাধারণত শ্রেণীর সংজ্ঞা থেকে ফলাফল শ্রেণীর বস্তু
- সাধারণত ফাংশন সংজ্ঞা থেকে ফাংশন ফাংশন
- স্মৃতিতে কেবল একবারে থাকা উচিত এমন অন্য কিছু (সমস্ত একক, সাধারণত)
- একটি নির্দিষ্ট অবজেক্ট যা আপনি পরিচয় দিয়ে চান
সাধারণ ব্যবহারের ক্ষেত্রে ==
অন্তর্ভুক্ত রয়েছে:
- পূর্ণসংখ্যা সহ সংখ্যাগুলি
- স্ট্রিং
- তালিকা
- সেট
- অভিধান
- কাস্টম পরিবর্তনযোগ্য বস্তু
- অন্যান্য বিল্টিন স্থাবর বস্তু, বেশিরভাগ ক্ষেত্রে
সাধারণ ব্যবহারের ক্ষেত্রে, আবার, জন্য ==
, বস্তুর যদি আপনি চান নাও হতে পারে একই বস্তু, এর পরিবর্তে এটি একটি হতে পারে সমতুল্য এক
পিইপি 8 দিকনির্দেশ
পিইপি 8, স্ট্যান্ডার্ড লাইব্রেরির জন্য পাইথন স্টাইল গাইড হিসাবে দুটি ব্যবহারের ক্ষেত্রেis
উল্লেখ করা হয়েছে :
সিঙ্গেলনের মতো তুলনা None
সর্বদা is
বা
is not
সমতা অপারেটরগুলির সাথে করা উচিত ।
এছাড়াও, if x
আপনার সত্যিকার অর্থে লেখার বিষয়ে সাবধান থাকুন if x is not None
- উদাহরণস্বরূপ যখন কোনও ভেরিয়েবল বা যুক্তি যা ডিফল্ট হয় None
তাকে অন্য কোনও মানতে সেট করা হয়েছিল কিনা তা পরীক্ষা করার সময়। অন্য মানটির মধ্যে একটি ধরণের (যেমন একটি ধারক) থাকতে পারে যা বুলিয়ান প্রসঙ্গে মিথ্যা হতে পারে!
পরিচয় থেকে সমতা ferringোকানো
যদি is
সত্য হয় তবে সাম্যতা সাধারণত অনুমান করা যায় - যৌক্তিকভাবে যদি কোনও বস্তু নিজে হয় তবে তা নিজের সমতুল্য হিসাবে পরীক্ষা করা উচিত।
বেশিরভাগ ক্ষেত্রে এই যুক্তিটি সত্য, তবে এটি __eq__
বিশেষ পদ্ধতির বাস্তবায়নের উপর নির্ভর করে । দস্তাবেজগুলি যেমন বলেছে,
সমতা তুলনা ( ==
এবং !=
) জন্য ডিফল্ট আচরণ বস্তুর সনাক্তকরণের উপর ভিত্তি করে। অতএব, একই পরিচয়ের সাথে উদাহরণগুলির সমতা তুলনা সমতাতে ফলাফল করে এবং বিভিন্ন পরিচয়ের সাথে দৃষ্টান্তের সাম্যের তুলনা অসমতার ফলস্বরূপ। এই ডিফল্ট আচরণের জন্য অনুপ্রেরণা হ'ল আকাঙ্ক্ষা যে সমস্ত বস্তুর প্রতিচ্ছবি হওয়া উচিত (অর্থাত্ x হ'ল ইঙ্গিত x == y)।
এবং ধারাবাহিকতার স্বার্থে, সুপারিশ করে:
সমতার তুলনা প্রতিচ্ছবি হওয়া উচিত। অন্য কথায়, অভিন্ন বস্তুর সমান তুলনা করা উচিত:
x is y
বোঝা x == y
আমরা দেখতে পাচ্ছি যে এটি কাস্টম অবজেক্টগুলির জন্য ডিফল্ট আচরণ:
>>> class Object(object): pass
>>> obj = Object()
>>> obj2 = Object()
>>> obj == obj, obj is obj
(True, True)
>>> obj == obj2, obj is obj2
(False, False)
সংশ্লেষমূলক এছাড়াও সাধারণত সত্য - যদি সামথিংস সমান না হিসাবে পরীক্ষা করে তবে আপনি সাধারণত এটি নির্ধারণ করতে পারেন যে তারা একই জিনিস নয়।
যেহেতু সাম্যতার জন্য পরীক্ষাগুলি অনুকূলিতকরণ করা যায়, তাই এই অনুমানটি সব ধরণের ক্ষেত্রে সর্বদা সত্য হয় না।
একটি ব্যতিক্রম
একটি উল্লেখযোগ্য ব্যতিক্রম হ'ল nan
- এটি সর্বদা নিজের সমান না হিসাবে পরীক্ষা করে:
>>> nan = float('nan')
>>> nan
nan
>>> nan is nan
True
>>> nan == nan # !!!!!
False
সাম্যতার জন্য যাচাই করা (যেগুলি পুনরাবৃত্তভাবে সদস্যদের চেক করার প্রয়োজন হতে পারে) চেয়ে পরিচয়ের জন্য চেক করা অনেক দ্রুত চেক হতে পারে।
তবে এটি সমতার জন্য প্রতিস্থাপিত হতে পারে না যেখানে আপনি সমান হিসাবে একাধিক বস্তু খুঁজে পেতে পারেন।
নোট করুন যে তালিকা এবং টিপলগুলির সমতার তুলনা করলে অবজেক্টের পরিচয় সমান বলে ধরে নেওয়া হবে (কারণ এটি একটি দ্রুত চেক)। যুক্তিটি অসম্পূর্ণ থাকলে এটি দ্বন্দ্ব তৈরি করতে পারে - যেমনটি এটির জন্য nan
:
>>> [nan] == [nan]
True
>>> (nan,) == (nan,)
True
একটি সতর্কতা কাহিনী:
প্রশ্নটি is
পূর্ণসংখ্যার তুলনা করতে ব্যবহার করার চেষ্টা করছে । আপনার ধরে নেওয়া উচিত নয় যে কোনও পূর্ণসংখ্যার উদাহরণটি অন্য রেফারেন্সের মাধ্যমে পাওয়া একই উদাহরণ। কেন এই গল্পটি ব্যাখ্যা করে।
একজন কমেন্টারের কোড ছিল যা এই সত্যের উপর নির্ভর করে যে ছোট পূর্ণসংখ্যার (-5 থেকে 256 অন্তর্ভুক্ত) সামঞ্জস্যতা যাচাইয়ের পরিবর্তে পাইথনে সিঙ্গেলন।
বাহ, এটি কিছু জালিয়াতি বাগের দিকে নিয়ে যেতে পারে। আমার কিছু কোড রয়েছে যা পরীক্ষা করেছে যে a বি হয় কিনা, যা আমি যেমন কাজ করেছিলাম তেমন কাজ করে কারণ একটি এবং বি সাধারণত ছোট সংখ্যা। বাগটি কেবলমাত্র ছয় মাস পরে উত্পাদন হয়েছে, কারণ ক এবং খ শেষ পর্যন্ত যথেষ্ট বড় ছিল যা ক্যাশে করা যায় না। - gwg
এটি উন্নয়নে কাজ করেছে। এটি কিছু ইউনিট পাস হতে পারে।
এবং এটি উত্পাদনে কাজ করেছিল - যতক্ষণ না কোড 256 এর চেয়ে বড় একটি পূর্ণসংখ্যার জন্য পরীক্ষা করে, ততক্ষণে এটি উত্পাদন ব্যর্থ হয়।
এটি এমন একটি উত্পাদন ব্যর্থতা যা কোড পর্যালোচনাতে বা সম্ভবত কোনও স্টাইল-পরীক্ষক দ্বারা ধরা পড়তে পারে।
আমাকে জোর দেওয়া যাক: সংখ্যার তুলনা করতে ব্যবহার করবেন না is
।
echo 'import sys;tt=sys.argv[1];print(tt is "foo", tt == "foo", id(tt)==id("foo"))'| python3 - foo
আউটপুট:False True False
।