تكرار السؤال: …
الإجابة المختصرة
تبحث Python عن الاسم بالترتيب: Local (الدالة الحالية) ثم Enclosing (الدوال المحيطة) ثم Global (الموديول) ثم Builtins.
الشرح
يحدد المترجم نطاق الاسم وقت الترجمة: أي إسناد لاسم داخل الدالة يجعله محليًا في كامل الدالة. لذلك قراءة متغير عام ثم الإسناد إليه في نفس الدالة ترمي UnboundLocalError. يمكن تغيير ذلك بـ global أو nonlocal، لكن تعديل الحالة العامة يصعّب الاختبار والتتبع؛ والأفضل تمرير القيم كمعاملات وإرجاع النتائج. كما أن تسمية متغير باسم دالة مدمجة مثل list أو id يحجبها.
مثال بالكود
count = 0
def increment():
count += 1 # UnboundLocalError: الإسناد جعل count محليًا
def increment_fixed(current: int) -> int:
return current + 1
list = [1, 2] # يحجب الدالة المدمجة list
list("abc") # TypeErrorأخطاء شائعة
- تسمية المتغيرات بأسماء مدمجة مثل list و dict و id و type.
- الاعتماد على global لمشاركة الحالة بين الدوال بدل تمريرها صراحةً.