অন্য সদৃশটি জিজ্ঞাসা করছিল কেন দুটি সমান স্ট্রিং সাধারণত অভিন্ন হয় না, যার উত্তর এখানে পাওয়া যায় না:
>>> x = 'a'
>>> x += 'bc'
>>> y = 'abc'
>>> x == y
True
>>> x is y
False
সুতরাং, কেন তারা একই স্ট্রিং হয় না? বিশেষত এটি দেওয়া:
>>> z = 'abc'
>>> w = 'abc'
>>> z is w
True
দ্বিতীয় অংশটি কিছুটা বন্ধ রেখে দেওয়া যাক। প্রথমটি কীভাবে সত্য হতে পারে?
ইন্টারপ্রেটারের একটি "ইন্টার্নিং টেবিল" থাকতে হবে, একটি টেবিল ম্যাপিং স্ট্রিংয়ের স্ট্রিং অবজেক্টগুলিতে স্ট্রিংয়ের মান রয়েছে, সুতরাং আপনি যখনই বিষয়বস্তুগুলির সাথে একটি নতুন স্ট্রিং তৈরি করার চেষ্টা করবেন 'abc'
, আপনি একই জিনিসটি ফিরে পাবেন। ইন্টার্নিং কীভাবে কাজ করে সে সম্পর্কে উইকিপিডিয়ায় আরও বিস্তারিত আলোচনা রয়েছে।
আর পাইথন হয়েছে একটি স্ট্রিং টেবিল interning; আপনি নিজেই sys.intern
পদ্ধতিতে স্ট্রিং ইন্টার্ন করতে পারেন ।
আসলে, পাইথনকে কোনও অপরিবর্তনীয় ধরণের স্বয়ংক্রিয়ভাবে ইন্টার্ন করার অনুমতি দেওয়া হয় তবে এটি প্রয়োজন হয় না হয় না। বিভিন্ন বাস্তবায়ন বিভিন্ন মানকে অন্তর্ভুক্ত করবে।
সিপিথন (আপনি যে প্রয়োগটি ব্যবহার করছেন তা যদি আপনি জানেন না তবে আপনি কী ব্যবহার করছেন) অটো-ইন্টার্নগুলি ছোট ছোট পূর্ণসংখ্যা এবং কিছু বিশেষ সিঙ্গেলন পছন্দ করে False
তবে স্ট্রিং নয় (বা বড় পূর্ণসংখ্যা বা ছোট্ট টিউপস বা অন্য কিছু)। আপনি এটি খুব সহজেই দেখতে পাবেন:
>>> a = 0
>>> a += 1
>>> b = 1
>>> a is b
True
>>> a = False
>>> a = not a
>>> b = True
a is b
True
>>> a = 1000
>>> a += 1
>>> b = 1001
>>> a is b
False
ঠিক আছে, তবে কেন z
এবং w
অভিন্ন ছিল?
এটি দোভাষী স্বয়ংক্রিয়ভাবে ইন্টার্নিং নয়, এটি সংকলক ভাঁজ মানগুলি।
একই কম্পাইল-টাইম স্ট্রিং একই মডিউলে দুইবার মনে হচ্ছে, যদি (ঠিক এর মানে সংজ্ঞায়িত এটা একটি স্ট্রিং আক্ষরিক একই জিনিস নয় কঠিন কারণ r'abc'
, 'abc'
এবং'a' 'b' 'c'
সব বিভিন্ন লিটারেল কিন্তু একই স্ট্রিং-কিন্তু সহজ বুঝতে স্বজ্ঞাতভাবে), সংকলকটি দুটি রেফারেন্স সহ কেবল স্ট্রিংয়ের একটি উদাহরণ তৈরি করবে।
আসলে, সংকলকটি আরও এগিয়ে যেতে পারে: অপ্টিমাইজার দ্বারা 'ab' + 'c'
রূপান্তরিত হতে পারে 'abc'
, 'abc'
এক্ষেত্রে এটি একই মডিউলের একটি ধ্রুবকের সাথে একসাথে ভাঁজ করা যেতে পারে ।
আবার, এটি পাইথনকে অনুমোদিত তবে এটি করার দরকার নেই। তবে এই ক্ষেত্রে সিপিথন সর্বদা ছোট স্ট্রিংগুলি ভাঁজ করে (এবং এছাড়াও, ছোট ছোট টিপলস)। (যদিও ইন্টারেক্টিভ ইন্টারপ্রেটারের স্টেটমেন্ট-বাই-স্টেটমেন্ট সংকলকটি মডিউল-এ-এ-টাইম সংকলক হিসাবে একই অপটিমাইজেশন চালায় না, তাই আপনি ইন্টারেক্টিভভাবে একই ফলাফল দেখতে পাবেন না))
সুতরাং, আপনি প্রোগ্রামার হিসাবে এই সম্পর্কে কি করা উচিত?
যাইহোক কিছুই না. দুটি অপরিবর্তনীয় মান অভিন্ন হলে আপনার যত্ন নেওয়ার কোনও কারণ নেই have আপনি যদি a is b
পরিবর্তে কখন ব্যবহার করতে পারেন a == b
তা জানতে চাইলে আপনি ভুল প্রশ্ন জিজ্ঞাসা করছেন। a == b
দুটি ক্ষেত্রে বাদে কেবল সর্বদা ব্যবহার করুন :
- আরও পড়তে পারা তুলনার জন্য সিঙ্গলটন মানগুলির মতো
x is None
।
- পরিবর্তনীয় মানগুলির জন্য, যখন আপনাকে জানতে হবে পরিবর্তনগুলি
x
প্রভাবিত করবে কিনা y
।