পাইথনের জমিতে কেন এমনটি ঘটে তা সত্যভাবে চিত্রিত করার জন্য এখানকার উত্তরের কোনও উত্তরই আপনাকে কোনও কোড দেয় না। এবং এটি আরও গভীর পদ্ধতির দিকে নজর দেওয়া মজাদার তাই এখানে যায়।
এটি আপনার প্রত্যাশার মতো কার্যকর না হওয়ার প্রাথমিক কারণটি পাইথনে, যখন আপনি লেখেন:
i += 1
এটি আপনি যা করছেন মনে করছেন তা করছে না। পূর্ণসংখ্যা পরিবর্তনযোগ্য। পাইথনের মধ্যে বস্তুটি আসলে কী আছে তা খতিয়ে দেখলে এটি দেখা যায়:
a = 0
print('ID of the first integer:', id(a))
a += 1
print('ID of the first integer +=1:', id(a))
আইডি ফাংশনটি তার জীবদ্দশায় কোনও জিনিসের জন্য একটি অনন্য এবং ধ্রুবক মান উপস্থাপন করে। ধারণাগতভাবে, এটি সি / সি ++ এর কোনও মেমরি ঠিকানায় আলগাভাবে মানচিত্র করে। উপরের কোডটি চলছে:
ID of the first integer: 140444342529056
ID of the first integer +=1: 140444342529088
এর অর্থ প্রথমটি a
আর দ্বিতীয়টির মতো নয় a
, কারণ তাদের আইডি আলাদা। কার্যকরভাবে তারা স্মৃতিতে বিভিন্ন স্থানে রয়েছে।
কোনও বস্তুর সাহায্যে জিনিসগুলি ভিন্নভাবে কাজ করে। আমি +=
এখানে অপারেটরটি ওভাররাইট করেছি :
class CustomInt:
def __iadd__(self, other):
# Override += 1 for this class
self.value = self.value + other.value
return self
def __init__(self, v):
self.value = v
ints = []
for i in range(5):
int = CustomInt(i)
print('ID={}, value={}'.format(id(int), i))
ints.append(int)
for i in ints:
i += CustomInt(i.value)
print("######")
for i in ints:
print('ID={}, value={}'.format(id(i), i.value))
নিম্নলিখিত ফলাফলের মধ্যে এই ফলাফলগুলি চালানো:
ID=140444284275400, value=0
ID=140444284275120, value=1
ID=140444284275064, value=2
ID=140444284310752, value=3
ID=140444284310864, value=4
######
ID=140444284275400, value=0
ID=140444284275120, value=2
ID=140444284275064, value=4
ID=140444284310752, value=6
ID=140444284310864, value=8
লক্ষ্য করুন যে এই ক্ষেত্রে আইডি বৈশিষ্ট্যটি উভয় পুনরাবৃত্তির জন্য একই , যদিও বস্তুর মান পৃথক হয় (আপনি id
বস্তুর ধারনকৃত মানটিরও সন্ধান করতে পারেন, যা পরিবর্তিত হওয়ার সাথে সাথে পরিবর্তিত হবে - কারণ পূর্ণসংখ্যার কারণ অপরিবর্তনীয়)।
আপনি যখন অপরিবর্তনীয় কোনও বস্তুর সাথে একই অনুশীলন পরিচালনা করেন তখন এর সাথে তুলনা করুন:
ints_primitives = []
for i in range(5):
int = i
ints_primitives.append(int)
print('ID={}, value={}'.format(id(int), i))
print("######")
for i in ints_primitives:
i += 1
print('ID={}, value={}'.format(id(int), i))
print("######")
for i in ints_primitives:
print('ID={}, value={}'.format(id(i), i))
এই ফলাফলগুলি:
ID=140023258889248, value=0
ID=140023258889280, value=1
ID=140023258889312, value=2
ID=140023258889344, value=3
ID=140023258889376, value=4
######
ID=140023258889280, value=1
ID=140023258889312, value=2
ID=140023258889344, value=3
ID=140023258889376, value=4
ID=140023258889408, value=5
######
ID=140023258889248, value=0
ID=140023258889280, value=1
ID=140023258889312, value=2
ID=140023258889344, value=3
ID=140023258889376, value=4
এখানে কয়েকটি বিষয় লক্ষ্য করা যায়। প্রথমত, এর সাথে লুপটিতে +=
আপনি আর আসল বস্তুতে যুক্ত হবেন না। এক্ষেত্রে পাইথনের অপরিবর্তনীয় প্রকারের মধ্যে অন্তরগুলি হওয়ায় পাইথন একটি আলাদা আইডি ব্যবহার করে। এছাড়াও আকর্ষণীয় লক্ষণীয় যে পাইথন id
একই স্থায়ী মান সহ একাধিক ভেরিয়েবলের জন্য একই অন্তর্নিহিত ব্যবহার করে:
a = 1999
b = 1999
c = 1999
print('id a:', id(a))
print('id b:', id(b))
print('id c:', id(c))
id a: 139846953372048
id b: 139846953372048
id c: 139846953372048
tl; dr - পাইথনের এক মুঠো অপরিবর্তনীয় প্রকার রয়েছে, যা আপনার দেখা আচরণের কারণ হয়ে দাঁড়ায়। সমস্ত পরিবর্তনীয় ধরণের জন্য, আপনার প্রত্যাশাটি সঠিক।
i
তা পরিবর্তনযোগ্য হয় বা আপনি একটি পরিবর্তন না করা অপারেশন চালিয়ে যাচ্ছেন। নেস্টেড তালিকারfor i in a: a.append(1)
সাথে আলাদা আচরণ থাকবে; পাইথন নেস্টেড তালিকাগুলি অনুলিপি করে না । তবে পূর্ণসংখ্যা পরিবর্তনযোগ্য এবং সংযোজন একটি নতুন অবজেক্ট ফিরিয়ে দেয়, এটি পুরানোটিকে পরিবর্তন করে না।