পাইথন 3 সময় সম্পর্কে কোনও সঠিক উত্তর ছিল না, তাই আমি এখানে একটি উত্তর দিয়েছি। এখানে বর্ণিত বেশিরভাগটি পাইথন 3 ডকুমেন্টেশনের নামের রেজোলিউশনে বিশদ বিবরণে রয়েছে ।
অন্যান্য উত্তরে প্রদত্ত হিসাবে, স্থানীয়, এনক্লোজিং, গ্লোবাল এবং বিল্টিনের জন্য 4 টি বেসিক স্কোপস, এলইজিবি রয়েছে। এগুলি ছাড়াও, একটি বিশেষ সুযোগ রয়েছে, বর্গ সংস্থা , যা শ্রেণীর মধ্যে সংজ্ঞায়িত পদ্ধতিগুলির জন্য একটি ঘেরের সুযোগ অন্তর্ভুক্ত করে না; ক্লাস বডির মধ্যে যে কোনও অ্যাসাইনমেন্ট সেখান থেকে পরিবর্তনশীলকে শ্রেণিবদ্ধ করে in
বিশেষত, এর বাইরে কোনও ব্লক বিবৃতি নেইdef
এবং class
একটি ভেরিয়েবল সুযোগ তৈরি করে। পাইথন 2-তে একটি তালিকা বোধগম্য একটি পরিবর্তনশীল সুযোগ তৈরি করে না, তবে পাইথন 3-এ তালিকার বোধগমের মধ্যে লুপ ভেরিয়েবলটি একটি নতুন সুযোগে তৈরি করা হয়েছে।
শ্রেণিবদ্ধের অদ্ভুততা প্রদর্শন করা
x = 0
class X(object):
y = x
x = x + 1 # x is now a variable
z = x
def method(self):
print(self.x) # -> 1
print(x) # -> 0, the global x
print(y) # -> NameError: global name 'y' is not defined
inst = X()
print(inst.x, inst.y, inst.z, x) # -> (1, 0, 1, 0)
সুতরাং ফাংশন বডি থেকে পৃথক, আপনি একই নামের সাথে একটি বর্গ ভেরিয়েবল পেতে, শ্রেণীর শরীরের একই পরিবর্তে ভেরিয়েবলটি পুনরায় সাইন করতে পারেন; এই নামে আরও অনুসন্ধানগুলি পরিবর্তে ক্লাস ভেরিয়েবলের সমাধান করুন।
পাইথনের কাছে নতুন আগতদের কাছে সবচেয়ে বড় আশ্চর্যের একটি হ'ল for
লুপ কোনও পরিবর্তনশীল সুযোগ তৈরি করে না। পাইথন 2-এ তালিকার বোধগম্যতাগুলি কোনও সুযোগ তৈরি করে না (যখন জেনারেটর এবং ডিক বোঝাপড়া করে!) পরিবর্তে তারা ফাংশনে বা বিশ্বব্যাপী সুযোগগুলিতে মান ফাঁস করে:
>>> [ i for i in range(5) ]
>>> i
4
পাইথন 2-এ ল্যাম্বডা এক্সপ্রেশনগুলির মধ্যে পরিবর্তনযোগ্য পরিবর্তনশীলগুলি তৈরি করার ধূর্ততা (বা আপনি যদি ভয়ঙ্কর হবেন) হিসাবে ব্যবহার করতে পারেন - ল্যাম্বডা এক্সপ্রেশনটি একটি বিবরণীয় স্কোপ তৈরি করে, যেমন def
বিবৃতি দেয়, তবে ল্যাম্বদার অভ্যন্তরে কোনও বিবৃতি অনুমোদিত নয়। পাইথনে স্টেটমেন্ট হওয়ার অর্থ হ'ল ল্যাম্বডায় কোনও ভেরিয়েবল অ্যাসাইনমেন্টের অনুমতি নেই তবে একটি তালিকা বোধগম্যতা একটি অভিব্যক্তি ...
পাইথন 3 এ এই আচরণটি স্থির করা হয়েছে - কোনও বোধগম্যতা বা জেনারেটর ফাঁস ভেরিয়েবলগুলি।
গ্লোবাল মানেই মডিউল স্কোপ; প্রধান পাইথন মডিউলটি হ'ল __main__
; সমস্ত আমদানি করা মডিউলগুলি sys.modules
ভেরিয়েবলের মাধ্যমে অ্যাক্সেসযোগ্য ; __main__
এক অ্যাক্সেস পেতে ব্যবহার করতে পারেন sys.modules['__main__']
, বা import __main__
; এটি অ্যাক্সেস এবং সেখানে বৈশিষ্ট্য নির্ধারণ করতে পুরোপুরি গ্রহণযোগ্য; তারা মূল মডিউলটির বৈশ্বিক স্কোপে পরিবর্তনশীল হিসাবে প্রদর্শিত হবে।
যদি বর্তমানের স্কোপে (শ্রেণীর ক্ষেত্র ব্যতীত) কোনও নাম নির্ধারিত হয় তবে তা সেই ক্ষেত্রের অন্তর্ভুক্ত বলে বিবেচিত হবে, অন্যথায় এটি ভেরিয়েবলের জন্য বরাদ্দকৃত কোনও সংযুক্তি স্কোপের সাথে সম্পর্কিত বলে বিবেচিত হবে (এটি নির্ধারিত নাও হতে পারে এখনও, বা একেবারেই নয়), বা শেষ পর্যন্ত বিশ্ব সুযোগ scope যদি ভেরিয়েবলটিকে স্থানীয় হিসাবে বিবেচনা করা হয়, তবে এটি এখনও সেট করা হয়নি বা মুছে ফেলা হয়েছে তবে ভেরিয়েবলের মানটি পড়ার ফলস্বরূপ UnboundLocalError
, এটি একটি সাবক্লাস NameError
।
x = 5
def foobar():
print(x) # causes UnboundLocalError!
x += 1 # because assignment here makes x a local variable within the function
# call the function
foobar()
সুযোগটি ঘোষণা করতে পারে যে এটি গ্লোবাল কীওয়ার্ড সহ স্পষ্টতই গ্লোবাল (মডিউল স্কোপ) পরিবর্তনশীলটি পরিবর্তন করতে চায়:
x = 5
def foobar():
global x
print(x)
x += 1
foobar() # -> 5
print(x) # -> 6
এটি বিস্তৃত ক্ষেত্রের ছায়ায় ছড়িয়ে থাকলেও এটি সম্ভব:
x = 5
y = 13
def make_closure():
x = 42
y = 911
def func():
global x # sees the global value
print(x, y)
x += 1
return func
func = make_closure()
func() # -> 5 911
print(x, y) # -> 6 13
অজগর 2 এ সংযুক্তি সুযোগে মানটি পরিবর্তন করার কোনও সহজ উপায় নেই; সাধারণত এটি একটি পরিবর্তনীয় মান দ্বারা সিমুলেট করা হয়, যেমন 1 দৈর্ঘ্যের একটি তালিকা:
def make_closure():
value = [0]
def get_next_value():
value[0] += 1
return value[0]
return get_next_value
get_next = make_closure()
print(get_next()) # -> 1
print(get_next()) # -> 2
তবে অজগর 3 এ, nonlocal
উদ্ধার করতে আসে:
def make_closure():
value = 0
def get_next_value():
nonlocal value
value += 1
return value
return get_next_value
get_next = make_closure() # identical behavior to the previous example.
nonlocal
ডকুমেন্টেশন বলছেন যে
একটি অ-স্থানীয় বিবৃতিতে তালিকাভুক্ত নামগুলি, বিশ্বব্যাপী বিবৃতিতে তালিকাভুক্ত এর বিপরীতে, অবশ্যই আবদ্ধ স্কোপের পূর্ব-বিদ্যমান বাইন্ডিংগুলিকে উল্লেখ করতে হবে (যে ক্ষেত্রটিতে একটি নতুন বাইন্ডিং তৈরি করা উচিত তা দ্ব্যর্থহীনভাবে নির্ধারণ করা যায় না)।
অর্থাত্ nonlocal
সর্বদা অন্তর্নির্মিত বহিরাগত অ-বৈশ্বিক সুযোগকে বোঝায় যেখানে নামটি আবদ্ধ হয়েছে (অর্থাত্ লক্ষ্যযুক্ত for
ভেরিয়েবল হিসাবে ব্যবহৃত হয়েছে, with
ক্লজটিতে অথবা কোনও ফাংশন প্যারামিটার হিসাবে)।
বর্তমান স্কোপ বা কোনও সংলগ্ন সুযোগের স্থানীয় হিসাবে বিবেচিত না এমন কোনও পরিবর্তনীয় একটি বৈশ্বিক পরিবর্তনশীল। মডিউল গ্লোবাল অভিধানে একটি বিশ্বব্যাপী নাম সন্ধান করা হয়; যদি খুঁজে না পাওয়া যায় তবে গ্লোবালটি বিল্টিন্স মডিউল থেকে সন্ধান করা হবে; মডিউলটির নাম অজগর 2 থেকে অজগর 3 করা হয়েছিল; পাইথন 2 এ এটি ছিল __builtin__
এবং অজগর 3 এ এখন বলা হয় builtins
। যদি আপনি বিল্টিনস মডিউলটির কোনও বৈশিষ্ট্য নির্ধারণ করে থাকেন তবে এটি পরে কোনও পঠনযোগ্য গ্লোবাল ভেরিয়েবল হিসাবে কোনও মডিউলের কাছে দৃশ্যমান হবে, যদি না যে মডিউলটি একই নামের সাথে তার নিজস্ব বৈকল্পিকের সাথে শেড করে না।
অন্তর্নির্মিত মডিউল পড়াও দরকারী হতে পারে; মনে করুন যে আপনি ফাইলের কিছু অংশে পাইথন 3 স্টাইলের মুদ্রণ ফাংশন চান তবে ফাইলের অন্যান্য অংশগুলি এখনও print
স্টেটমেন্টটি ব্যবহার করে । পাইথন ২.6-২..7 এ আপনি পাইথন 3 print
ফাংশনটি এর সাথে ধরে রাখতে পারেন :
import __builtin__
print3 = __builtin__.__dict__['print']
পাইথন 2- এ from __future__ import print_function
প্রকৃতপক্ষে কোনও print
স্থানে আমদানি করা হয় না - পরিবর্তে এটি কেবলমাত্র print
বর্তমান মডিউলে বিবৃতি দেওয়ার জন্য পার্সিং বিধিগুলি অক্ষম করে , print
অন্য কোনও পরিবর্তনশীল শনাক্তকারীর মতো পরিচালনা করে এবং এভাবে print
বিল্টিনগুলিতে ফাংশনটি সন্ধান করতে দেয়।