"Foo is no" এবং "foo == কিছুই নয়" এর মধ্যে কি কোনও পার্থক্য রয়েছে?


217

এর মধ্যে কোনও পার্থক্য আছে:

if foo is None: pass

এবং

if foo == None: pass

আমি বেশিরভাগ পাইথন কোডে যে কনভেনশনটি দেখেছি (এবং আমি নিজে কোডটি লিখি) এটি পূর্ববর্তী, তবে আমি সম্প্রতি কোডটি পেয়েছি যা পরে ব্যবহার করে। কোনটিই ননডাইপ-এর কোনও উদাহরণ (এবং একমাত্র উদাহরণ, আইআইআরসি) নয়, তাই এটি কি ঠিক ব্যাপার নয়? এমন কোনও পরিস্থিতি রয়েছে যা এটি হতে পারে?

উত্তর:


253

isTrueযদি এটি একই বস্তুর উদাহরণের সাথে তুলনা করে তবে সর্বদা ফিরে আসে

যদিও ==চূড়ান্তভাবে __eq__()পদ্ধতি দ্বারা নির্ধারিত হয়

অর্থাত


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

>>> f = Foo()
>>> f == None
True
>>> f is None
False

51
আপনি যুক্ত করতে চাইতে পারেন যে কোনওটিই সিঙ্গলটন নয় তাই "কিছুই নয় কিছুই" সর্বদা সত্য।
ই-সন্তুষ্ট

43
এবং আপনি যুক্ত করতে পারেন যে isঅপারেটরটি কাস্টমাইজ করা যায় না (কোনও ব্যবহারকারী-সংজ্ঞায়িত শ্রেণীর দ্বারা ওভারলোড)।
মার্টিনো

@ স্টুডি পদ্ধতিটি __eq__(self)একটি বিশেষ বিল্টিন পদ্ধতি যা ==পাইথন অবজেক্টে ব্যবহৃত হলে কীভাবে পরিচালনা করা হয় তা নির্ধারণ করে। এখানে আমরা এটি ওভাররাইড করেছি যাতে ==টাইপের বস্তুগুলিতে যখন ব্যবহৃত হয় Fooএটি সর্বদা সত্য হয় true isঅপারেটরের জন্য সমতুল্য পদ্ধতি নেই এবং তাই আচরণের isএকই পদ্ধতিতে পরিবর্তন করা যায় না।
ব্রেন্ডন

এটি কি কারণ ফু ক্লাসের সংজ্ঞায় কোনও কনস্ট্রাক্টর নেই, অর্থাত্ ডিআর ফাংশন নেই?
অধ্যয়ন

49

আপনি এই বস্তুর পরিচয় এবং সমতা পড়তে চাইতে পারেন ।

'Is' স্টেটমেন্টটি অবজেক্ট আইডেন্টিটির জন্য ব্যবহৃত হয়, এটি পরীক্ষা করে যে বস্তুগুলি একই উদাহরণ (মেমরিতে একই ঠিকানা) উল্লেখ করে কিনা।

এবং '==' বিবৃতিটি সমতা (একই মান) বোঝায়।


হুম, আমি মনে করি আপনার লিঙ্কটি পরিবর্তিত হয়েছে, যদি না আপনি পাইথন থেকে বাহ্যিক ফাংশনগুলি কল করতে
প্যাট

আমি শুধু চেষ্টা করেছি a=1;b=1;print(a is b) # Truea is bতারা যদি 2 টি ভিন্ন বস্তু (স্মৃতিতে পৃথক ঠিকানা) বলে মনে হয় তবে কেন এটি সত্য বলে প্রমাণিত হয়?
জনি চিউ

24

সাবধানতার একটি শব্দ:

if foo:
  # do something

কি না ঠিক মতো একই:

if x is not None:
  # do something

প্রাক্তনটি বুলিয়ান মান পরীক্ষা এবং বিভিন্ন প্রসঙ্গে মিথ্যাতে মূল্যায়ন করতে পারে। বুলিয়ান মান পরীক্ষায় মিথ্যা প্রতিনিধিত্ব করে এমন অনেকগুলি বিষয় রয়েছে যেমন খালি পাত্রে, বুলিয়ান মানগুলি। এই পরিস্থিতিতে কেউ মিথ্যাও মূল্যায়ন করে না তবে অন্যান্য জিনিসও তা করে।


12

(ob1 is ob2) সমান (id(ob1) == id(ob2))


6
... তবে (ob হল ob2) খুব দ্রুত is টাইমিট বলেছেন "(a বি বি)" প্রতি লুপে 0.0365 ইউজেক এবং "(আইডি (এ) == আইডি (বি))" প্রতি লুপে 0.153 ইউজেক। 4.2x দ্রুত!
একেএম

4
isসংস্করণ ফাংশন কল, এবং সব সময়ে কোন পাইথন-ব্যাখ্যাকারী অ্যাট্রিবিউট লুকআপ দরকার; দোভাষী যদি তাত্ক্ষণিকভাবে উত্তর দিতে পারেন তবে ওপ 1 হ'ল, ob2।
u0b34a0f6ae

17
না, তা হয় না। {} is {}মিথ্যা এবং এটি সত্য id({}) == id({})(এবং সিপাইটিতে রয়েছে) সত্য হতে পারে। দেখুন stackoverflow.com/questions/3877230
পাযত্র Dobrogost

12

কারণটি foo is Noneপছন্দের উপায় হ'ল আপনি সম্ভবত এমন কোনও বিষয় পরিচালনা করছেন যা তার নিজস্ব সংজ্ঞা দেয় __eq__, এবং এটি কোনওটির সমান হতে সংজ্ঞা দেয়। সুতরাং, foo is Noneযদি এটি দেখতে পারা যায় তবে তা সর্বদা ব্যবহার করুন None


8

কোনও পার্থক্য নেই কারণ যে বস্তুগুলি অবশ্যই অভিন্ন ইচ্ছাগুলি সমান। তবে, পিইপি 8 স্পষ্টভাবে জানিয়েছে আপনার ব্যবহার করা উচিত is:

সিলেটনের সাথে তুলনা করুন সর্বদা কোনওটিই সর্বদা করা বা করা উচিত নয়, কখনওই সমতা অপারেটরগুলি নয়।


7

isপরিচয়ের জন্য পরীক্ষা, না সাম্য। আপনার বক্তব্যের জন্য foo is noneপাইথন কেবলমাত্র বস্তুর মেমরি ঠিকানার সাথে তুলনা করে। এর অর্থ আপনি প্রশ্ন জিজ্ঞাসা করছেন "একই জিনিসের জন্য কি আমার দুটি নাম আছে?"

==অন্যদিকে __eq__()পদ্ধতি দ্বারা নির্ধারিত হিসাবে সমতা জন্য পরীক্ষা । এটি পরিচয় সম্পর্কে চিন্তা করে না।

In [102]: x, y, z = 2, 2, 2.0

In [103]: id(x), id(y), id(z)
Out[103]: (38641984, 38641984, 48420880)

In [104]: x is y
Out[104]: True

In [105]: x == y
Out[105]: True

In [106]: x is z
Out[106]: False

In [107]: x == z
Out[107]: True

Noneএকটি সিঙ্গলটন অপারেটর। তাই None is Noneসর্বদা সত্য।

In [101]: None is None
Out[101]: True

5

কারও জন্যই সমতা (==) এবং পরিচয় (এর) মধ্যে পার্থক্য থাকা উচিত নয়। ননটাইপ সম্ভবত সমতার জন্য পরিচয় ফিরিয়ে দেয়। যেহেতু কিছুই নয় আপনি ননটাইপটি তৈরি করতে পারবেন না (আমার মনে হয় এটি সত্য), দুটি ক্রিয়াকলাপ একই। অন্যান্য ধরণের ক্ষেত্রে এটি সর্বদা হয় না। উদাহরণ স্বরূপ:

list1 = [1, 2, 3]
list2 = [1, 2, 3]
if list1==list2: print "Equal"
if list1 is list2: print "Same"

এটি "সমান" মুদ্রণ করবে যেহেতু তালিকার একটি তুলনা ক্রিয়াকলাপ রয়েছে যা পরিচয়ের ডিফল্ট ফেরত নয়।


5

@ জেসন :

আমি লাইনের পাশাপাশি আরও কিছু ব্যবহার করার পরামর্শ দিচ্ছি

if foo:
    #foo isn't None
else:
    #foo is None

আমি "if foo:" ব্যবহার করা পছন্দ করি না যদি না foo সত্যিকার অর্থে বুলিয়ান মান (যেমন 0 বা 1) উপস্থাপন করে। Foo যদি একটি স্ট্রিং বা কোনও অবজেক্ট বা অন্য কিছু হয় তবে "if foo:" কাজ করতে পারে তবে এটি আমার কাছে অলস শর্টকাটের মতো দেখাচ্ছে। আপনি যদি এক্স কোনও নয় কিনা তা পরীক্ষা করে দেখেন, "যদি এক্স কোনও নয়:" বলুন।


"If var" দিয়ে খালি স্ট্রিং / তালিকাগুলি পরীক্ষা করা পছন্দসই উপায়। বুলিয়ান রূপান্তরটি ভালভাবে সংজ্ঞায়িত হয়েছে, এবং এটি এমন কম কোড যা এমনকি আরও ভাল সম্পাদন করে। উদাহরণস্বরূপ "if len (mylist) == 0" করার কোনও কারণ নেই।
truppo

ভুল। ধরুন foo = ""। তারপরে if fooমিথ্যা ফিরিয়ে দেবে এবং মন্তব্যটি #foo is Noneভুল।
ব্লোকলে

স্বল্প লোকদের জন্য নোট - আমার উত্তরটি এমন একটি উত্তর উদ্ধৃত করছে যা মুছে ফেলা হয়েছে এবং এর সাথে দ্বিমত পোষণ করছে। আপনি যদি না আমার উত্তর কোড মতো, আপনি প্রয়োজন ভোট দিন । :-)
গ্রিম পেরো

2

আরও কিছু বিশদ:

  1. isদফা আসলে চেক দুই যদি objectগুলি একই মেমরি অবস্থানকে বা না আছে। অর্থাত্ তারা উভয়ই একই স্মৃতি অবস্থানের দিকে নির্দেশ করে এবং একই থাকে id

  2. 1 এর ফলস্বরূপ, isনিশ্চিত করা হয় যে দুটি বর্ণিত উপস্থাপিতের objectঅভিন্ন বৈশিষ্ট্য রয়েছে (বৈশিষ্ট্যগুলির বৈশিষ্ট্যগুলি ...) আছে কি না

  3. মত আদিম ধরনের ইনস্ট্যান্স bool, int, string(কিছু ব্যতিক্রম), NoneTypeএকটি একই মান না থাকার সবসময় একই মেমরি অবস্থানকে মধ্যে হতে হবে।

যেমন

>>> int(1) is int(1)
True
>>> str("abcd") is str("abcd")
True
>>> bool(1) is bool(2)
True
>>> bool(0) is bool(0)
True
>>> bool(0)
False
>>> bool(1)
True

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


2
প্রত্যেকে এটি পড়ছেন: some_string is "bar"স্ট্রিংগুলিকে কখনও তুলনা করতে ব্যবহার করবেন না । এটি করার একটি একক গ্রহণযোগ্য কারণ নেই এবং যখন আপনি এটি প্রত্যাশা করবেন না তখন এটি ঘটবে BREAK। এটি প্রায়শই কাজ করে এমন ঘটনা কেবল কারণ সিপিথন জানে যে একই বিষয়বস্তুযুক্ত দুটি অপরিবর্তনীয় বস্তু তৈরি করা বোকামি হবে। তবে তা তবুও ঘটতে পারে।
চোরমাস্টার

@ থিফমাস্টার এর উত্তরে কি ভুল ধারণা নিয়ে যাওয়ার প্রবণতা রয়েছে? যদিও, এটি আবার পড়ার পরে আমি এটি হতে পেলাম না ("কিছু ব্যতিক্রমের উল্লেখ সহ)"। আপনার বক্তব্যটি কেবল স্ট্রিংগুলির জন্য ধারণ করে এবং তাই না int?
রক্তক্ষরণ আঙ্গুল

আসলেই নয়, তবে যেহেতু আপনার উত্তরে সেই উদাহরণটি আছে তাই আমি ভেবেছিলাম ব্যবহারকারীদের সতর্ক করা ভাল ধারণা হবে যে এটি ব্যবহার করা খারাপ ধারণা। সেই লাইনের পিছনে "# সিপিথন সুনির্দিষ্ট / গ্যারান্টিযুক্ত নয়" জাতীয় কিছু যুক্ত করুন ...
থিফমাস্টার

1

জন মাচিনের উপসংহার যা Noneএকটি সিঙ্গলটন এই কোড দ্বারা উত্সাহিত একটি উপসংহার।

>>> x = None
>>> y = None
>>> x == y
True
>>> x is y
True
>>> 

যেহেতু Noneএকটি সিঙ্গলটন, x == Noneএবং x is Noneএকই ফলাফল হবে। যাইহোক, আমার নান্দনিক মতে, x == Noneসেরা।


2
এই উত্তরটির শেষে আমি মতামতের সাথে একমত নই। স্পষ্টভাবে কারও সাথে তুলনা করার সময়, সাধারণত উদ্দেশ্য হয় যে প্রশ্নে থাকা Noneঅবজেক্টটি হুবহু অবজেক্ট। তুলনা করে, একটি খুব কমই Falseঅন্যান্য মানগুলিতে সত্য হওয়ার সাথে মিলে যাওয়া ব্যতীত অন্য কোনও প্রসঙ্গে ব্যবহৃত হয় না sees এই ক্ষেত্রে এমন কিছু করা আরও if x: pass
বুদ্ধিমানের

0
a is b # returns true if they a and b are true alias
a == b # returns true if they are true alias or they have values that are deemed equivalence 


a = [1,3,4]
b = a[:] #creating copy of list
a is b # if gives false
False
a == b # gives true
True
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.