"==" এবং "হয়" এর মধ্যে কি পার্থক্য রয়েছে?


630

আমার গুগল-ফু আমাকে ব্যর্থ করেছে।

পাইথনে, সমতা সমমানের জন্য নিম্নলিখিত দুটি পরীক্ষা করা যায়?

n = 5
# Test one.
if n == 5:
    print 'Yay!'

# Test two.
if n is 5:
    print 'Yay!'

আপনি যে উদাহরণগুলির সাথে তুলনা করবেন (এমন একটি listবক্তব্য) সেগুলির জন্য এটি কি সত্য ?

ঠিক আছে, সুতরাং এই ধরণের উত্তর আমার প্রশ্নের:

L = []
L.append(1)
if L == [1]:
    print 'Yay!'
# Holds true, but...

if L is [1]:
    print 'Yay!'
# Doesn't.

সুতরাং ==পরীক্ষাগুলির মানগুলি যেখানে isপরীক্ষাগুলি দেখতে একই জিনিস হয় কিনা?

উত্তর:


927

isTrueযদি দুটি ভেরিয়েবল একই বস্তুতে নির্দেশ ==করে তবে ভেরিয়েবল দ্বারা উল্লিখিত বস্তু সমান হলে তা ফিরে আসবে ।

>>> a = [1, 2, 3]
>>> b = a
>>> b is a 
True
>>> b == a
True

# Make a new copy of list `a` via the slice operator, 
# and assign it to variable `b`
>>> b = a[:] 
>>> b is a
False
>>> b == a
True

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

>>> 1000 is 10**3
False
>>> 1000 == 10**3
True

একই স্ট্রিং আক্ষরিক জন্য সত্য:

>>> "a" is "a"
True
>>> "aa" is "a" * 2
True
>>> x = "a"
>>> "aa" is x * 2
False
>>> "aa" is intern(x*2)
True

দয়া করে এই প্রশ্নটি দেখুন ।


2
আমি দেখেছি যে: echo 'import sys;tt=sys.argv[1];print(tt is "foo", tt == "foo", id(tt)==id("foo"))'| python3 - fooআউটপুট: False True False
অহিগো

b = a[:]স্লাইস অপারেটর তালিকার অনুলিপি অংশটি দিয়ে আপনি আমাকে হারিয়েছেন , তাই আমি এখানে একটি মন্তব্য করার জন্য আপনার উত্তর সম্পাদনা করেছি। দেখে মনে হচ্ছে যে আমি প্রয়োগগুলি প্রয়োগ করার আগে আমার সম্পাদনাগুলি পর্যালোচনা না করে সবেমাত্র প্রান্তিক স্থানে পৌঁছেছি, সুতরাং আশা করি এটি আপনার সাথে দুর্দান্ত। নির্বিশেষে, আমি যে তালিকাটি পেরিয়ে এসেছি এবং কী করছিলাম তা নির্ধারণ করার জন্য এখানে কীভাবে দরকারী কপির জন্য একটি দরকারী রেফারেন্স রয়েছে: স্ট্যাকওভারফ্লো.com
গ্যাব্রিয়েল স্ট্যাপলস

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

3
1000 is 10**310 ** 3 টাইপ হওয়ায় পাইথন ৩.7 এ ট্রুতে মূল্যায়ন করে int। কিন্তু 1000 is 1e31e3 টাইপ হওয়ায় মিথ্যাতে মূল্যায়ন করে float
আহমেদ ফসিহ

@ আহমেদফ্যাসিহ 1000 is 10**3সত্য কিনা বা না তা বাস্তবায়ন নির্ভর, এবং এক্সপ্রেশনটির প্রাক-মূল্যায়ন সংকলকটির উপর নির্ভর করে 10**3x=10; 1000 is x**3মূল্যায়ন False
চিপনার

311

থাম্বের একটি সহজ নিয়ম রয়েছে আপনাকে কখন ব্যবহার করতে হবে ==বা তা জানাতে is

  • ==জন্য মান সমতা । আপনি যখন দুটি বস্তুর সমান মান রাখেন তা জানতে চাইলে এটি ব্যবহার করুন।
  • isজন্য রেফারেন্স সমতা । যখন আপনি দুটি বিষয়গুলি একই অবজেক্টের উল্লেখ করে তা জানতে চাইলে এটি ব্যবহার করুন।

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


আরও কিছু লক্ষণীয়: সিপিথন রেফারেন্স বাস্তবায়ন যেভাবে কাজ করে আপনি সেই কারণে অপ্রত্যাশিত এবং অসঙ্গত ফলাফল পাবেন যদি আপনি ভুল isকরে পূর্ণসংখ্যার উপর রেফারেন্স সমতার জন্য তুলনা করতে ব্যবহার করেন:

>>> a = 500
>>> b = 500
>>> a == b
True
>>> a is b
False

এটি আমাদের প্রত্যাশার চেয়ে অনেক বেশি: aএবং bএকই মান রয়েছে তবে স্বতন্ত্র সত্তা। তবে এই কি?

>>> c = 200
>>> d = 200
>>> c == d
True
>>> c is d
True

এটি পূর্ববর্তী ফলাফলের সাথে সঙ্গতিপূর্ণ নয়। এখানে কি হচ্ছে? এটি পারফরম্যান্স কারণে সিঙ্গেলটন দৃষ্টান্ত হিসাবে পাইথন ক্যাচ পূর্ণসংখ্যক -5..256 রেঞ্জের রেফারেন্স প্রয়োগ করে turns এখানে এটি প্রদর্শিত একটি উদাহরণ:

>>> for i in range(250, 260): a = i; print "%i: %s" % (i, a is int(str(i)));
... 
250: True
251: True
252: True
253: True
254: True
255: True
256: True
257: False
258: False
259: False

এটি ব্যবহার না করার অন্য একটি সুস্পষ্ট কারণ is: আপনি যখন ভ্রান্তভাবে মান সমতার জন্য ব্যবহার করছেন তখন আচরণটি বাস্তবায়নগুলিতে ছেড়ে দেওয়া হবে।


এর প্রথম উদাহরণটির সাথে a=500এবং b=500, কেবলমাত্র এটিই উল্লেখ করতে চেয়েছিলেন যে আপনি যদি সেট করেন aএবং b[-5, 256] এর মধ্যে একটি সংখ্যার সাথে সংযুক্ত হন তবে a is bআসলে ফিরে আসে True। এখানে আরো তথ্য: stackoverflow.com/q/306313/7571052
AsheKetchum

1
@ অ্যাশেকেটচাম, হ্যাঁ, নোট করুন যে আমি লিখেছি "এটি পাইথনের রেফারেন্স প্রয়োগকে পারফরম্যান্সের কারণে সিঙ্গেলটন দৃষ্টান্ত হিসাবে -5..256 রেঞ্জের পূর্ণসংখ্যা বস্তুগুলির ক্যাশে করে" "
জন ফেমেনিলা

34

==মানগুলি সমান isকিনা তা নির্ধারণ করে যখন তারা ঠিক একই বস্তু কিনা তা নির্ধারণ করে।


32

পাইথন ==এবং এর 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


"ব্যবহার করবেন না মোটেও" একটি ভাল নিয়ম হবে। মূর্খবাদী is Noneএকটি ব্যতিক্রম, কিন্তু এটি == Noneখুব কার্যকর বলেছিল ...
জিন-ফ্রানসোয়া ফ্যাব্রে

@ জিন-ফরাসোইসফ্যাবের আরেকটি ব্যতিক্রম: অফিসিয়াল ডকুমেন্টেশনগুলিরis সাথে তুলনা করার জন্য ব্যবহার করার পরামর্শ দেওয়া হয়েছে বলে মনে হচ্ছে Enum
আর্থার

@Arthur আমি ব্যবহারের ক্ষেত্রে একটি তালিকা যুক্ত করেছেন ...
হারুন হলের

19

মধ্যে পার্থক্য কি isএবং ==?

==এবং isবিভিন্ন তুলনা হয়! অন্যরা ইতিমধ্যে বলেছে:

  • == বস্তুর মানগুলির তুলনা করে।
  • is বস্তুর উল্লেখগুলি তুলনা করে।

পাইথনে নামগুলি বস্তুগুলিকে উল্লেখ করে, উদাহরণস্বরূপ এই ক্ষেত্রে value1এবং মান সংরক্ষণের value2একটি intউদাহরণ উল্লেখ করুন 1000:

value1 = 1000
value2 = value1

এখানে চিত্র বর্ণনা লিখুন

কারণ value2একই বস্তুকে বোঝায় isএবং ==দেবে True:

>>> value1 == value2
True
>>> value1 is value2
True

নিম্নলিখিত উদাহরণে নাম value1এবং value2পৃথক intউদাহরণগুলি উল্লেখ করুন, এমনকি যদি উভয়ই একই পূর্ণসংখ্যা সঞ্চয় করে:

>>> value1 = 1000
>>> value2 = 1000

এখানে চিত্র বর্ণনা লিখুন

কারণ একই মান (পূর্ণসংখ্যা) সংরক্ষণ করা হয় ==হতে হবে True, যে কেন এটা প্রায়ই বলা হচ্ছে "মান তুলনা"। তবে isফিরে আসবে Falseকারণ এগুলি বিভিন্ন বস্তু:

>>> value1 == value2
True
>>> value1 is value2
False

কখন ব্যবহার করবেন?

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

আপনার কেবল তখনই ব্যবহার করাis উচিত যদি আপনি:

  • দুটি বস্তু সত্যই একই জিনিস (কেবল একই "মান" নয়) তা পরীক্ষা করতে চান। একটি উদাহরণ হতে পারে যদি আপনি ধ্রুবক হিসাবে সিঙ্গলটন অবজেক্টটি ব্যবহার করেন।
  • পাইথন ধ্রুবকের সাথে একটি মান তুলনা করতে চাই । পাইথনের ধ্রুবকগুলি হ'ল:

    • None
    • True1
    • False1
    • NotImplemented
    • Ellipsis
    • __debug__
    • ক্লাস (উদাহরণস্বরূপ int is intবা int is float)
    • অন্তর্নির্মিত মডিউল বা তৃতীয় পক্ষের মডিউলগুলিতে অতিরিক্ত ধ্রুবক থাকতে পারে। উদাহরণস্বরূপ np.ma.maskedNumPy মডিউল থেকে)

ইন প্রত্যেক অন্যান্য ক্ষেত্রে আপনি ব্যবহার করা উচিত== সমতার জন্য বার করো।

আমি কি আচরণটি কাস্টমাইজ করতে পারি?

কিছু দৃষ্টিভঙ্গি হয় ==এটা এর অংশ: যে অন্যান্য উত্তর আগে থেকেই উল্লেখ করা হয় নি অজগর "ডাটা মডেল" । তার অর্থ __eq__পদ্ধতিটি ব্যবহার করে এর আচরণটি কাস্টমাইজ করা যায় । উদাহরণ স্বরূপ:

class MyClass(object):
    def __init__(self, val):
        self._value = val

    def __eq__(self, other):
        print('__eq__ method called')
        try:
            return self._value == other._value
        except AttributeError:
            raise TypeError('Cannot compare {0} to objects of type {1}'
                            .format(type(self), type(other)))

পদ্ধতিটি সত্যই বলা হয় এটি চিত্রিত করার জন্য এটি কেবল একটি কৃত্রিম উদাহরণ:

>>> MyClass(10) == MyClass(10)
__eq__ method called
True

নোট করুন যে ডিফল্টরূপে (অন্য কোনও প্রয়োগ যদি __eq__শ্রেণি বা সুপারক্লাসে পাওয়া যায় না) __eq__ব্যবহার করে is:

class AClass(object):
    def __init__(self, value):
        self._value = value

>>> a = AClass(10)
>>> b = AClass(10)
>>> a == b
False
>>> a == a

সুতরাং __eq__আপনি যদি কাস্টম ক্লাসের জন্য কেবল রেফারেন্স-তুলনা না করে "আরও" চান তবে এটি বাস্তবায়ন করা গুরুত্বপূর্ণ !

অন্যদিকে আপনি isচেকগুলি কাস্টমাইজ করতে পারবেন না । আপনার কাছে একই রেফারেন্স থাকলে এটি সর্বদা তুলনা করবে ।

এই তুলনাগুলি কি সর্বদা একটি বুলিয়ান ফিরিয়ে দেবে?

কারণ __eq__পুনরায় বাস্তবায়ন বা ওভাররাইড করা যায়, এটি কেবল ফিরে আসা Trueবা সীমাবদ্ধ নয় False। এটি কোনও কিছু ফেরত দিতে পারে (তবে বেশিরভাগ ক্ষেত্রে এটির একটি বুলিয়ান ফেরত দেওয়া উচিত!)।

উদাহরণস্বরূপ NumPy অ্যারে দিয়ে ==একটি অ্যারে ফিরিয়ে দেবে:

>>> import numpy as np
>>> np.arange(10) == 2
array([False, False,  True, False, False, False, False, False, False, False], dtype=bool)

তবে isচেক সবসময় ফিরবে Trueনাকি False!


1 যেমন অ্যারন হল মন্তব্যগুলিতে উল্লেখ করেছেন:

সাধারণত আপনার কোন না করা উচিত নয় is Trueবা is Falseচেক কারণ এক সাধারণত একটি প্রসঙ্গ যে পরোক্ষভাবে পরিবর্তন করে এই "চেক" ব্যবহার শর্ত (একটি ইন উদাহরণস্বরূপ একটি বুলিয়ান করার ifবিবৃতি)। সুতরাং is Trueতুলনা করা এবং অন্তর্নিহিত বুলিয়ান কাস্ট কেবল বুলিয়ান কাস্ট না করেই আরও কাজ করছেন - এবং আপনি নিজেকে বুলিয়ানদের মধ্যে সীমাবদ্ধ করেন (যা পাইথোনিক হিসাবে বিবেচিত হয় না)।

পিইপি 8 এর মতো উল্লেখ করুন:

Trueবা Falseব্যবহারের সাথে বুলিয়ান মানগুলির তুলনা করবেন না ==

Yes:   if greeting:
No:    if greeting == True:
Worse: if greeting is True:

2
"ধ্রুবকগুলি" এর সাথে তুলনা করার জন্য আমি আপনার দৃ on is়তার সাথে একমত হতে চলেছি - যে নামগুলি বুলিয়ানদের দিকে নির্দেশ করে সেগুলি বুলিয়ান প্রসঙ্গে - যেমন if __debug__:বা হিসাবে চিহ্নিত করা উচিত if not __debug__:। আপনার কখনই করা উচিত নয় if __debug__ is True:বা if __debug__ == True:- আরও, একটি ধ্রুবক নিছক একটি ধ্রুবক শব্দার্থক মান, একটি সিঙ্গলটন নয়, সুতরাং isসেই ক্ষেত্রে চেক করা শব্দার্থগতভাবে সঠিক নয়। আমি আপনার চ্যালেঞ্জকে সমর্থন করার জন্য একটি উত্স খুঁজে পাওয়ার জন্য আপনাকে চ্যালেঞ্জ জানাই - আমি মনে করি না আপনি কোনওটি খুঁজে পাবেন।
হারুন হলের

@ অ্যারনহল আপনাকে কী মনে করে যে ধ্রুবকগুলি সিলেটলেট নয়? নোট যে শুধুমাত্র None, True, Falseএবং __debug__কি, "ধ্রুব শব্দার্থিক মান" কল করবে, কারণ তারা পুনরায় নির্ধারণ করা যাবে না হয়। তবে এঁরা সকলেই সিঙ্গেলন।
এমসিফার্ট

পিইপি 8 পড়ুন - Ctrl-F এবং "আরও খারাপ" শব্দটির সন্ধান করুন। - আপনি যদি ইউনিট করে চলেছেন তবে আপনি সেলফ.সেসার্টট্রু ব্যবহার করবেন
অ্যারন হল

@ অ্যারোনহল কিছু পরিস্থিতিতে আপনার সত্যই প্রয়োজন is Trueবা if Falseচেক প্রয়োজন (তবে হ্যাঁ, এটি বেশ বিরল - তবে আপনি যদি এটি করেন তবে আপনি তাদের ব্যবহার করে এটি করতে পারেনis )। এজন্য এমনকি সিপিথনও তাদের মাঝে মাঝে ব্যবহার করে (উদাহরণস্বরূপ এখানে বা এখানে )
ম্যাসিফের্ট

19

এগুলি সম্পূর্ণ আলাদাisবস্তুর পরিচয় পরীক্ষা করার জন্য, যখন== সমতার জন্য পরীক্ষা করে (এমন ধারণা যা দুটি অপারেন্ডের ধরণের উপর নির্ভর করে)।

এটি কেবল একটি ভাগ্যবান কাকতালীয় বিষয় যা " is" ছোট ছোট পূর্ণসংখ্যার (যেমন 5 == 4 + 1) দিয়ে সঠিকভাবে কাজ করে বলে মনে হয়। এটি কারণ সিপিথন পরিসীমাতে পূর্ণ পরিসংখ্যান (-5 থেকে 256 )গুলিকে সিঙ্গেলন করে অনুকূলিত করে । এই আচরণটি সম্পূর্ণ বাস্তবায়ন-নির্ভর এবং ছোটখাটো রূপান্তরমূলক ক্রিয়াকলাপের সমস্ত পদ্ধতিতে সংরক্ষণের গ্যারান্টিযুক্ত নয়।

উদাহরণস্বরূপ, পাইথন 3.5 এছাড়াও সংক্ষিপ্ত স্ট্রিং সিলেটলেট তৈরি করে, তবে তাদের টুকরো টুকরো করা এই আচরণকে ব্যহত করে:

>>> "foo" + "bar" == "foobar"
True
>>> "foo" + "bar" is "foobar"
True
>>> "foo"[:] + "bar" == "foobar"
True
>>> "foo"[:] + "bar" is "foobar"
False

10

https://docs.python.org/library/stdtypes.html#comparisons

is পরিচয়ের জন্য পরীক্ষা ==সমতা পরীক্ষা জন্য পরীক্ষা

প্রতিটি (ছোট) পূর্ণসংখ্যার মান একক মানকে ম্যাপ করা হয়, তাই প্রতি 3 টি অভিন্ন এবং সমান। এটি একটি বাস্তবায়নের বিশদ, যদিও ভাষার নির্দিষ্ট অংশ নয়


6

আপনার উত্তরটি সঠিক। isঅপারেটর দুটি বস্তুর পরিচয় তুলনা করা হয়। ==অপারেটর দুটি বস্তুর মান তুলনা করা হয়।

কোনও বস্তুর পরিচয় একবারে এটি তৈরি হয়ে ওঠে না; আপনি এটিকে স্মৃতিতে অবজেক্টের ঠিকানা হিসাবে ভাবতে পারেন।

আপনি কোনও __cmp__পদ্ধতি বা সমৃদ্ধ তুলনা পদ্ধতিটি নির্ধারণ করে অবজেক্টের মানগুলির তুলনা আচরণ নিয়ন্ত্রণ করতে পারেন __eq__


4

স্ট্যাক ওভারফ্লো প্রশ্নটি দেখুন পাইথনের "হয়" অপারেটরটি পূর্ণসংখ্যার সাথে অপ্রত্যাশিতভাবে আচরণ করে

এটি বেশিরভাগ ক্ষেত্রে কী উত্সাহিত করে তা হ'ল " is" তারা একে অপরের সমান নয়, একই বস্তু কিনা তা পরীক্ষা করে দেখায় (256 এর নীচে সংখ্যাগুলি একটি বিশেষ ক্ষেত্রে রয়েছে)।


3

সংক্ষেপে, isদুটি উল্লেখ একই পদার্থের দিকে নির্দেশ করে কিনা তা পরীক্ষা করে। ==দুটি বস্তুর একই মান আছে কি না তা পরীক্ষা করে।

a=[1,2,3]
b=a        #a and b point to the same object
c=list(a)  #c points to different object 

if a==b:
    print('#')   #output:#
if a is b:
    print('##')  #output:## 
if a==c:
    print('###') #output:## 
if a is c:
    print('####') #no output as c and a point to different object 

2

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

নাইনেটাইপের একটি এবং একমাত্র দৃষ্টান্ত অর্থাৎ কোনওটিই সিঙ্গলটন নয়। ফলস্বরূপ foo == Noneএবং foo is Noneএকই অর্থ। তবে isপরীক্ষাটি দ্রুত এবং পাইথোনিক কনভেনশনটি ব্যবহার করা foo is None

আপনি যদি আবর্জনা সংগ্রহের সাথে কিছুটা অন্তঃসংশোধন করছেন বা মশকরা করছেন বা আপনার কাস্টম-বিল্ট স্ট্রিং ইন্টার্নিং গ্যাজেটটি কাজ করছে বা এর মতো কাজ করছে কিনা তা খতিয়ে দেখছেন, তবে সম্ভবত আপনার ব্যবহারের ক্ষেত্রে fooরয়েছে bar

সত্য এবং মিথ্যাগুলিও (এখন) সিলেটলেট, তবে foo == Trueকোনও ব্যবহারের ক্ষেত্রে নেই এবং এর জন্য কোনও ব্যবহারের ক্ষেত্রে নেই foo is True


2

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

== যদি ভেরিয়েবল দ্বারা উল্লিখিত বস্তুগুলি সমান হয়

উপরের উত্তরগুলি পড়তে হবে

== যদি ভেরিয়েবল দ্বারা উল্লিখিত বস্তুগুলি সমান হয় এবং একই ধরণের / শ্রেণীর অন্তর্ভুক্ত বস্তুগুলি

। আমি নীচের পরীক্ষার ভিত্তিতে এই সিদ্ধান্তে পৌঁছেছি:

list1 = [1,2,3,4]
tuple1 = (1,2,3,4)

print(list1)
print(tuple1)
print(id(list1))
print(id(tuple1))

print(list1 == tuple1)
print(list1 is tuple1)

এখানে তালিকার বিষয়বস্তু এবং টিপল একই তবে ধরণ / শ্রেণি আলাদা।


2

পাইথন পার্থক্য হল এবং সমান (==)

অপারেটরটি সাম্য অপারেটরের সমান মনে হতে পারে তবে তারা একই নয়।

উভয় ভেরিয়েবল একই বস্তুর দিকে নির্দেশ করে কিনা তা পরীক্ষা করা হয় যেখানে দুটি ভেরিয়েবলের মান একই হয় তবে == স্বাক্ষর পরীক্ষা করে।

সুতরাং যদি অপারেটরটি সত্য ফেরত দেয় তবে সমতাটি অবশ্যই সত্য, তবে বিপরীতটি সত্য হতে পারে বা নাও পারে।

সাদৃশ্য এবং পার্থক্য প্রদর্শনের জন্য এখানে একটি উদাহরণ is

>>> a = b = [1,2,3]
>>> c = [1,2,3]
>>> a == b
True
>>> a == c
True
>>> a is b
True
>>> a is c
False
>>> a = [1,2,3]
>>> b = [1,2]
>>> a == b
False
>>> a is b
False
>>> del a[2]
>>> a == b
True
>>> a is b
False
Tip: Avoid using is operator for immutable types such as strings and numbers, the result is unpredictable.

1
অন্য উত্স থেকে উদ্ধৃত পাঠ্যের জন্য দয়া করে কেবল ব্লক উদ্ধৃতিগুলি ব্যবহার করুন, সেই মুহুর্তে আপনাকে অবশ্যই বিশিষ্টতা অন্তর্ভুক্ত করতে হবে ( স্ট্যাকওভারফ্লো . com/help/references ) দেখুন। এটি যদি আপনার নিজস্ব পাঠ্য হয় তবে দয়া করে ব্লক উদ্ধৃতিগুলি সরিয়ে দিন।
মার্টিজন পিটারস

1

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

স্ট্রিং তুলনার জন্য, এর ==পরিবর্তে ব্যবহার করতে ভুলবেন না is:

str = 'hello'
if (str is 'hello'):
    print ('str is hello')
if (str == 'hello'):
    print ('str == hello')

বাইরে:

str is hello
str == hello

তবে নীচের উদাহরণে ==এবং isবিভিন্ন ফলাফল পাবেন:

str = 'hello sam'
    if (str is 'hello sam'):
        print ('str is hello sam')
    if (str == 'hello sam'):
        print ('str == hello sam')

বাইরে:

str == hello sam

উপসংহার:

isস্ট্রিংগুলির মধ্যে তুলনা করতে সাবধানতার সাথে ব্যবহার করুন


স্পেসের সাথে স্ট্রিংয়ের জন্য "কেন" "কেন এমনভাবে কাজ করে?
আকাশ গুপ্ত

পূর্ববর্তী উত্তর অনুসারে: মনে হচ্ছে অজগরটি ছোট ছোট পূর্ণসংখ্যা এবং স্ট্রিংগুলিতে ক্যাচিং করে যা এর অর্থ এই কোড স্ন্যাপশটে 'হ্যালো' স্ট্রিং সংঘটনগুলির জন্য একই অবজেক্ট রেফারেন্সটি ব্যবহার করে, যখন এটি 'হ্যালো সাম'-এর জন্য ক্যাচিং প্রিফর্ম করে না while 'হ্যালো' এর তুলনায় তুলনামূলকভাবে বড় (যেমন এটি 'হ্যালো স্যাম' স্ট্রিংয়ের বিভিন্ন উল্লেখ পরিচালনা করে, এবং এজন্যই 'হ'ল' অপারেটর পরবর্তী উদাহরণে মিথ্যা প্রত্যাবর্তন করে) আমি ভুল হলে দয়া করে আমাকে সংশোধন করুন
রিদা শামসনেহে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.