যুক্তি অ্যাসাইনমেন্ট দ্বারা পাস হয় । এর পিছনে যুক্তি দ্বিগুণ:
- পাস হওয়া প্যারামিটারটি আসলে কোনও জিনিসের রেফারেন্স (তবে রেফারেন্সটি মান দ্বারা পাস হয়)
- কিছু ডেটা ধরণের পরিবর্তনীয়, তবে অন্যগুলি তা নয়
তাই:
আপনি যদি কোনও ব্যবস্থায় কোনও পরিবর্তনীয় অবজেক্টটি পাস করেন , পদ্ধতিটি একই জিনিসটির একটি রেফারেন্স পেয়েছে এবং আপনি এটি আপনার হৃদয়ের আনন্দের সাথে রূপান্তর করতে পারেন, তবে আপনি যদি পদ্ধতিতে রেফারেন্সটি পুনরায় প্রত্যাবর্তন করেন তবে বাইরের সুযোগটি এ সম্পর্কে কিছুই জানতে পারবে না এবং পরে আপনি শেষ করেছেন, বাহ্যিক রেফারেন্সটি এখনও মূল অবজেক্টটিকে নির্দেশ করবে।
আপনি যদি কোনও পদ্ধতির ক্ষেত্রে অপরিবর্তনীয় বস্তুটি পাস করেন তবে আপনি এখনও বাহ্যিক রেফারেন্সটি পুনর্নির্মাণ করতে পারবেন না এবং আপনি এই বস্তুটিকে পরিবর্তন করতে পারবেন না।
এটিকে আরও স্পষ্ট করার জন্য আসুন কয়েকটি উদাহরণ দেওয়া যাক।
তালিকা - একটি পরিবর্তনীয় প্রকার
একটি পদ্ধতিতে পাস করা তালিকাটি পরিবর্তনের চেষ্টা করা যাক:
def try_to_change_list_contents(the_list):
print('got', the_list)
the_list.append('four')
print('changed to', the_list)
outer_list = ['one', 'two', 'three']
print('before, outer_list =', outer_list)
try_to_change_list_contents(outer_list)
print('after, outer_list =', outer_list)
আউটপুট:
before, outer_list = ['one', 'two', 'three']
got ['one', 'two', 'three']
changed to ['one', 'two', 'three', 'four']
after, outer_list = ['one', 'two', 'three', 'four']
যেহেতু প্যারামিটারটি পাশ করা হয়েছে এটি একটি outer_list
অনুলিপি নয়, একটি রেফারেন্স , তাই আমরা এটিকে পরিবর্তন করতে পরিবর্তনীয় তালিকার পদ্ধতিগুলি ব্যবহার করতে পারি এবং বাইরের স্কোপগুলিতে পরিবর্তনগুলি প্রতিবিম্বিত করতে পারি।
এখন আসুন দেখুন আমরা যখন প্যারামিটার হিসাবে পাস করা রেফারেন্সটি পরিবর্তন করার চেষ্টা করি তখন কী হয়:
def try_to_change_list_reference(the_list):
print('got', the_list)
the_list = ['and', 'we', 'can', 'not', 'lie']
print('set to', the_list)
outer_list = ['we', 'like', 'proper', 'English']
print('before, outer_list =', outer_list)
try_to_change_list_reference(outer_list)
print('after, outer_list =', outer_list)
আউটপুট:
before, outer_list = ['we', 'like', 'proper', 'English']
got ['we', 'like', 'proper', 'English']
set to ['and', 'we', 'can', 'not', 'lie']
after, outer_list = ['we', 'like', 'proper', 'English']
যেহেতু the_list
প্যারামিটারটি মান দ্বারা উত্তীর্ণ হয়েছিল, সুতরাং এটির জন্য একটি নতুন তালিকা নির্ধারণের কোনও প্রভাব নেই যে পদ্ধতির বাইরের কোডটি দেখতে পেত। এটি the_list
ছিল outer_list
রেফারেন্সের একটি অনুলিপি , এবং আমাদের the_list
একটি নতুন তালিকার outer_list
দিকে ইঙ্গিত করা হয়েছিল, তবে যেখানে নির্দেশিত সেখানে পরিবর্তন করার কোনও উপায় ছিল না ।
স্ট্রিং - একটি অপরিবর্তনীয় প্রকার
এটি পরিবর্তনযোগ্য, তাই স্ট্রিংয়ের বিষয়বস্তু পরিবর্তন করতে আমরা কিছুই করতে পারি না
এখন, রেফারেন্স পরিবর্তন করার চেষ্টা করা যাক
def try_to_change_string_reference(the_string):
print('got', the_string)
the_string = 'In a kingdom by the sea'
print('set to', the_string)
outer_string = 'It was many and many a year ago'
print('before, outer_string =', outer_string)
try_to_change_string_reference(outer_string)
print('after, outer_string =', outer_string)
আউটপুট:
before, outer_string = It was many and many a year ago
got It was many and many a year ago
set to In a kingdom by the sea
after, outer_string = It was many and many a year ago
আবার, যেহেতু the_string
প্যারামিটারটি মান দ্বারা পাস হয়ে গেছে, এটিতে একটি নতুন স্ট্রিং নির্ধারণের ফলে কোনও প্রভাব নেই যে পদ্ধতির বাইরের কোডটি দেখতে পেত। এটি the_string
ছিল outer_string
রেফারেন্সের একটি অনুলিপি , এবং আমাদের the_string
একটি নতুন স্ট্রিংয়ের outer_string
দিকে ইঙ্গিত করা হয়েছিল, তবে যেখানে নির্দেশিত সেখানে পরিবর্তন করার কোনও উপায় ছিল না ।
আমি আশা করি এটি কিছুটা পরিষ্কার হয়ে যায়।
সম্পাদনা: এটি লক্ষ্য করা গেছে যে @ ডেভিড মূলত জিজ্ঞাসা করা এই প্রশ্নের উত্তর দেয় না, "প্রকৃত উল্লেখ দ্বারা ভেরিয়েবলটি পাস করার জন্য আমি কি কিছু করতে পারি?" এর উপর কাজ করা যাক।
আমরা কিভাবে এই কাছাকাছি পেতে পারি?
@ অ্যান্ড্রিয়ার উত্তরগুলি দেখায় আপনি নতুন মানটি ফিরিয়ে দিতে পারবেন। এটি জিনিসগুলিতে যেভাবে প্রেরণ করা হবে তা পরিবর্তন করে না, তবে আপনি কী চান তা তথ্য ফিরে পেতে দেয়:
def return_a_whole_new_string(the_string):
new_string = something_to_do_with_the_old_string(the_string)
return new_string
# then you could call it like
my_string = return_a_whole_new_string(my_string)
আপনি যদি সত্যিই কোনও রিটার্ন মান ব্যবহার করা এড়াতে চান, আপনি নিজের মান ধরে রাখতে এবং এটি ফাংশনে পাস করতে বা তালিকার মতো একটি বিদ্যমান শ্রেণি ব্যবহার করতে পারেন:
def use_a_wrapper_to_simulate_pass_by_reference(stuff_to_change):
new_string = something_to_do_with_the_old_string(stuff_to_change[0])
stuff_to_change[0] = new_string
# then you could call it like
wrapper = [my_string]
use_a_wrapper_to_simulate_pass_by_reference(wrapper)
do_something_with(wrapper[0])
যদিও এটি কিছুটা জটিল বলে মনে হচ্ছে।