পাইথন এর তুলনা নেই: আমি কি "হয়" বা == ব্যবহার করব?


213

আমি যখন তুলনা করি তখন আমার সম্পাদক আমাকে সতর্ক করে my_var == Noneতবে আমি যখন ব্যবহার করি তখন কোনও সতর্কতা নেই my_var is None

আমি পাইথন শেলটিতে একটি পরীক্ষা করেছি এবং নির্ধারণ করেছি যে উভয়ই বৈধ সিনট্যাক্স, তবে আমার সম্পাদকটি my_var is Noneএটি পছন্দ বলে মনে করছেন ।

এই ঘটনাটি কি এবং যদি তাই হয় তবে কেন?


7
PEP 8 কোথাও বলছেন যে আপনি ব্যবহার singletons তুলনা করা উচিত নয় is- python.org/dev/peps/pep-0008/#programming-recommendations
উদ্বায়ীতামূলক

2
সেই পোস্টারটি পাইথন 3 নিয়ে কথা বলছে, এবং আমার প্রশ্নটি পাইথন ২.x সম্পর্কে is আমি নিশ্চিত নই যে এই দুটিই পরোয়ানা পাওয়ার পক্ষে যথেষ্ট পার্থক্য কিনা তবে আমি প্রশ্নটি সম্পাদনা করে এটিকে কেবল ক্ষেত্রে অন্তর্ভুক্ত করতে পারি।
ক্লে ওয়ার্ডেল

2
আমি মনে করি না এই প্রশ্নটি আসলে একটি সদৃশ। অন্যটি ছিল প্রায় == বনাম সাধারণভাবে, এটি বিশেষত কোনওটিই সম্পর্কে নয়।
আইজে কেনেডি

উত্তর:


254

সারসংক্ষেপ:

isযখন আপনি কোনও সামগ্রীর পরিচয় (যেমন কিনা তা পরীক্ষা করে দেখার varজন্য None) পরীক্ষা করতে চান তখন ব্যবহার করুন । ==আপনি যখন সাম্যতা পরীক্ষা করতে চান তখন ব্যবহার করুন (যেমন varসমান 3?)?

ব্যাখ্যা:

আপনার কাস্টম ক্লাস থাকতে পারে যেখানে my_var == Noneফিরে আসবেTrue

উদাহরণ:

class Negator(object):
    def __eq__(self,other):
        return not other

thing = Negator()
print thing == None    #True
print thing is None    #False

isবস্তুর জন্য চেক পরিচয় । কেবলমাত্র 1 টি অবজেক্ট রয়েছে None, সুতরাং যখন আপনি এটি করেন my_var is None, তখন পরীক্ষা করছেন যে তারা আসলে একই জিনিস (কেবল সমমানের বস্তু নয়)

অন্য কথায়, ==সমতুল্যতার জন্য যাচাই করা হয় (যা বস্তু থেকে অন্য বস্তুতে সংজ্ঞায়িত হয়) যেখানে isবস্তুর পরিচয়ের জন্য পরীক্ষা করা হয়:

lst = [1,2,3]
lst == lst[:]  # This is True since the lists are "equivalent"
lst is lst[:]  # This is False since they're actually different objects

22
কখন is Noneথেকে আলাদা হয় == None?
ব্লেন্ডার

11
@ ব্লেন্ডার উল্লিখিত ক্ষেত্রে। __eq__যে কোনও উপায়ে সংজ্ঞায়িত করা যায় তবে এর আচরণ isএত সহজে পরিবর্তন করা যায় না।
লেভ লেভিটস্কি

5
@ লিভলিভিটস্কি: মাইথনের ব্যবহারের উদাহরণগুলির মধ্যে একটি হ'ল "প্রোটোকলগুলি প্রসারিত করা যাতে কোনও অপারেটর এমনকি ওভারলোড করা যায় is"। তালিকাগুলিতে মন্তব্য করার পরে, তিনি এটিকে "" এমনকি is(তবে আপনি উন্মাদ হয়ে থাকলে) পরিবর্তন করেছিলেন।
অবতরণ

1
+1, তবে আরও উত্তম হবে যদি এই উত্তরে অন্যের মতো করা পিইপি 8 উল্লেখটি অন্তর্ভুক্ত করা হয় (পাশাপাশি পিইপি 8 এর পিছনে সিদ্ধান্তটি কেন বোধগম্য হয় যা এটি ইতিমধ্যে বোঝায়)।
২২:২০ এ

3
@ বার্নার্ট - আমি জানি না যে পিইপি 8 এখানে একটি সুপারিশ করেছে। মুল বক্তব্যটি হ'ল তারা বিভিন্ন অপারেটর যা বিভিন্ন কাজ করে। সেখানে ক্ষেত্রে যেখানে হতে পারে object == Noneআসলে হয় সঠিক বাগ্ধারা (যদিও আমি আমার মাথার উপরে বন্ধ কোনো ভাবতে পারি না)। আপনি কেবল কি করছেন তা আপনার জানতে হবে।
মিগিলসন

127

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

এই সুপারিশটি পিইপি 8 দ্বারা সমর্থিত , যা স্পষ্টতই বলেছে যে "কোনওটির মতো সিলেটনের তুলনা সবসময় করা উচিত নয় isবা is notকখনওই সমতা অপারেটরদের সাথে করা উচিত নয় ।"


6
এটি পোস্ট করার জন্য ধন্যবাদ; গৃহীত উত্তর কিছু আকর্ষণীয় পয়েন্ট তোলে, কিন্তু আপনার প্রশ্নের সরাসরি আরও সরাসরি প্রতিক্রিয়া।
লুক ডেভিস

মূলত একটি বাস্তবায়ন বিশদ কী তার উপর নির্ভর করা অদ্ভুত বলে মনে হয়। ননটাইপটির কতগুলি উদাহরণ রয়েছে তা কেন আমার যত্ন নেওয়া উচিত?
বলপয়েন্টবেন

@BallpointBen কারণ এটা না একটি বাস্তবায়ন বিস্তারিত - শুধুমাত্র এক আছে Noneবিশ্বব্যাপী ধ্রুবক অধীনে বস্তু None। যদি কিছু হয় তবে NoneTypeতা বাস্তবায়নের বিশদ কারণ Noneসিঙ্গলটনের অবশ্যই কিছু প্রকার থাকতে হবে। (আপনি এই ধরণের উদাহরণ তৈরি করতে পারবেন না এটি একটি ভাল ইঙ্গিত যে এর এক উদাহরণটি
সিঙ্গলটন

@ বালপয়েন্টপেন আমি মনে করি মূল বিষয়টি হ'ল পাইথন অবজেক্ট আইডেন্টিটির একটি দৃ concept় ধারণা ধারণ করেছে। আপনি করতে চান তাহলে একটি বস্তু তুলনা কিনা সমান করতে None, সকল পদ্ধতি ব্যবহার obj == None। আপনি একটি বস্তু কিনা চেক করতে চান, তাহলে হয় None , ব্যবহার obj is None। পিইপি 8 সুপারিশের মূল বিষয় (এবং এই উত্তরটির) হ'ল বেশিরভাগ লোকেরা যখন কোনওটির জন্য অনুসন্ধান করতে চান না তখন তারা চান এবং এটি আরও দ্রুত এবং স্পষ্ট হয়।
ব্যবহারকারী 481516234242

Noneক্যাশেড অবজেক্টের মতো 0এবং অন্যান্য ছোট ছোট পূর্ণসংখ্যার চেয়েও পৃথক , যেখানে ক্যাশিংটি বাস্তবায়নের বিশদ। পার্থক্যটি হ'ল একটি পূর্ণসংখ্যার অভ্যন্তরীণ মান থাকে যা তার বৈশিষ্ট্য দেয় এবং এটি গণনা করা যায়। অন্যদিকে, Noneএর কোনও রাজ্য নেই, এটি কেবল এটির পরিচয় যা এটি গুরুত্বপূর্ণ এবং এটি বিশেষ করে তোলে।
ব্যবহারকারীর 4815162342

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.