-1-
-2-
Local and Global Scopes كيف التعبير عن الـ local والـ global variable في الـ Python؟
# Local vs Global Variables في Python
## 1. المتغيرات المحلية (Local Variables)
المتغير **محلي** إذا تم تعريفه **داخل** دالة. لا يمكن الوصول إليه من خارج الدالة.
```python
def my_func():
x = 10 # x متغير محلي
print(x)
my_func() # 10
print(x) # ❌ NameError: name 'x' is not defined
```
كل استدعاء للدالة ينشئ نسخة جديدة من المتغير المحلي:
```python
def counter():
n = 0
n += 1
print(n)
counter() # 1
counter() # 1 ← تبدأ من الصفر كل مرة
```
---
## 2. المتغيرات العامة (Global Variables)
المتغير **عام** إذا تم تعريفه **خارج** جميع الدوال (على مستوى الموديول). يمكن **قراءته** من داخل أي دالة.
```python
x = 100 # متغير عام
def show():
print(x) # ✅ يمكن القراءة
show() # 100
print(x) # 100
```
---
## 3. الفرق الأساسي: القراءة vs التعديل
### ✅ القراءة من داخل الدالة — تعمل بدون مشاكل
```python
x = 5
def read_x():
print(x) # 5
read_x()
```
### ❌ التعديل بدون `global` — ينشئ متغير محلي جديد!
```python
x = 5
def change_x():
x = 10 # هذا متغير محلي جديد، وليس العام!
print(x)
change_x() # 10
print(x) # 5 ← العام لم يتغير
```
Python يعتبر أي إسناد داخل الدالة تعريفًا لمتغير **محلي**، إلا إذا أخبرته بغير ذلك.
---
## 4. كلمة `global`
تستخدم لتعديل متغير عام من داخل دالة:
```python
x = 5
def change_x():
global x # أعلن أن x هنا هو العام
x = 10
change_x()
print(x) # 10 ✅
```
⚠️ **تحذير**: لا تستخدم `global` إلا عند الضرورة — فهي تجعل الكود أصعب في التتبع والاختبار.
---
## 5. كلمة `nonlocal` (للدوال المتداخلة)
تستخدم للوصول لمتغير في الدالة **الأم** (وليس العام):
```python
def outer():
x = 10
def inner():
nonlocal x # يشير إلى x في outer
x = 20
inner()
print(x) # 20
outer()
```
بدون `nonlocal`، `x = 20` داخل `inner` ستنشئ متغيرًا محليًا جديدًا، ويبقى `x` في `outer` يساوي 10.
---
## 6. قاعدة LEGB
Python يبحث عن الأسماء بهذا الترتيب:
| الحرف | المعنى | المكان |
|-------|--------|--------|
| **L** | Local | داخل الدالة الحالية |
| **E** | Enclosing | الدوال المحيطة (المتداخلة) |
| **G** | Global | مستوى الموديول |
| **B** | Built-in | أسماء Python المدمجة (`len`, `print`...) |
```python
x = 'global'
def outer():
x = 'enclosing'
def inner():
x = 'local'
print(x) # local ← أول تطابق
inner()
outer()
```
---
---
## 8. ملاحظات مهمة
- **أسماء المعاملات (parameters)** محلية دائمًا:
```python
def f(x): # x محلي
x = 5
```
-3-
-4-
