স্কোপ মানে আপনার কোডের কোথা থেকে একটি ভ্যারিয়েবল দেখা আর ব্যবহার করা যায় — প্রোগ্রামিং পরিচিতি-তে শেখা একই ধারণা, আর Python-এর নিয়ম PHP-এর কাছাকাছি, একটি অর্থবহ পার্থক্যসহ।
একটি ফাংশনের ভেতরে তৈরি হওয়া ভ্যারিয়েবল শুধু সেই ফাংশনের ভেতরেই থাকে, ঠিক PHP-এর মতো:
def set_name():
name = "Priya" # local to set_name()
print(name) # works fine here
set_name()
# print(name) # NameError — name doesn't exist out hereএখানেই PHP থেকে পার্থক্য: একটি Python ফাংশন কোনো বিশেষ কীওয়ার্ড ছাড়াই একটি গ্লোবাল ভ্যারিয়েবল পড়তে পারে — PHP-তে শুধু একটি পড়তেও global দরকার, Python-এ শুধু একটি পুনরায় assign করতে এটি দরকার:
site_name = "Learn Computer Academy"
def show_name():
print(site_name) # works — reading a global needs nothing special
show_name()একটি ফাংশনের ভেতরে একটি নামে assign করলে Python ডিফল্টভাবে সেটাকে লোকাল হিসেবে গণ্য করে — এমনকি একই নামের একটি গ্লোবাল থাকলেও। এটা override করে আসল গ্লোবাল ভ্যারিয়েবলে পুনরায় assign করতে global দরকার:
count = 0
def increment_broken():
count = count + 1 # UnboundLocalError — count is treated as local here,
# and it hasn't been assigned yet at this point
def increment():
global count
count = count + 1 # now this correctly modifies the global
increment()
print(count) # 1global-এর বদলে প্যারামিটার প্রাধান্য দিন
পুরো একটি কোডবেসে global-এর উপর নির্ভর করলে একটি মান আসলে কোথা থেকে আসছে তা খুঁজে বের করা কঠিন হয়ে যায় — PHP-এর মতো একই সতর্কতা। পরিষ্কার, বেশি প্রচলিত প্যাটার্ন হলো মানটিকে একটি প্যারামিটার হিসেবে পাস করা আর নতুন মান রিটার্ন করা, সরাসরি একটি গ্লোবাল পরিবর্তন করার বদলে।
কিছু ভাষা থেকে আরেকটি আসল পার্থক্য: Python-এ একটি if বা for ব্লকের ভেতরে তৈরি হওয়া একটি ভ্যারিয়েবল সেই ব্লকে সীমাবদ্ধ নয় — এটি ঘিরে থাকা ফাংশনের বাকি অংশের জন্য দৃশ্যমান:
def check(n):
if n > 0:
result = "positive"
print(result) # this works even outside the if block, as long as n > 0 ran
check(5) # "positive"