المتغير والثابت في بايثون

المتغير والثابت في بايثون

تشرح هذه المقالة المتغير والثابت في بايثون۔

YouTube Video

المتغير والثابت في بايثون

"المتغير" و"الثابت" يشيران إلى قابلية تغيير الكائن۔ فهم هذا يساعد في تجنب الأخطاء غير المتوقعة وإدارة الذاكرة بكفاءة۔

ما هو المتغير؟

الكائنات المتغيرة يمكن أن يتم تغيير حالتها الداخلية بعد إنشائها۔

أنواع البيانات المتغيرة الرئيسية

  • list
  • dict
  • set
  • الفئات المعرفة من قبل المستخدم (إذا كانت خصائصها قابلة للتعديل)

مثال: تعديل قائمة

1numbers = [1, 2, 3]
2numbers[0] = 100
3print(numbers)  # [100, 2, 3]

القائمة هي كائن متغير، ويمكن تعديل عناصرها بحرية.۔

ما هو الثابت؟

الكائنات الثابتة لا يمكن تغييرها بمجرد إنشائها۔ محاولة تعديلها تؤدي إلى إنشاء كائن جديد۔

أنواع البيانات الثابتة الرئيسية

  • int
  • float
  • str
  • tuple
  • bool
  • frozenset

مثال: تعديل نص

1text = "hello"
2# text[0] = "H"  # TypeError: 'str' object does not support item assignment
3
4text = "H" + text[1:]  # Creates a new string
5print(text)  # "Hello"

النصوص ثابتة، لذا لا يمكنك تعديلها جزئيًا۔

مقارنة بين المتغير والثابت

 1# Mutable example
 2a = [1, 2, 3]
 3b = a
 4b[0] = 100
 5print(a)  # [100, 2, 3] -> a is also changed
 6
 7# Immutable example
 8x = 10
 9y = x
10y = 20
11print(x)  # 10 -> x is unchanged

كما ترى في هذا المثال، الكائنات القابلة للتغيير تتم مشاركتها بالإشارة، لذلك يمكنها التأثير على المتغيرات الأخرى۔ من ناحية أخرى، الكائنات غير القابلة للتغيير تنشئ نسخًا جديدة عند إعادة التعيين، مما يترك القيمة الأصلية دون تأثير۔

فحص السلوك الداخلي باستخدام id()

في Python، يمكنك استخدام الدالة id() للتحقق من معرف الكائن۔ معرف الكائن يشبه عنوان الذاكرة۔

 1# Immutable int behavior
 2a = 10
 3print(id(a))  # e.g., 140715920176592
 4a += 1
 5print(id(a))  # e.g., 140715920176624 -> ID has changed
 6
 7# Mutable list behavior
 8b = [1, 2, 3]
 9print(id(b))  # e.g., 2819127951552
10b.append(4)
11print(id(b))  # Same ID -> only the content has changed

كما هو موضح، يتم إنشاء كائن جديد لأنواع البيانات غير القابلة للتغيير، بينما تتغير الأنواع القابلة للتغيير في مكانها۔

الوظائف والحذر مع الكائنات القابلة وغير القابلة للتغيير

عند تمرير كائن قابل للتغيير إلى وظيفة، قد يتم تعديل البيانات الأصلية۔

مثال: وظيفة تقوم بتعديل قائمة

1def modify_list(lst):
2    lst.append(100)
3
4my_list = [1, 2, 3]
5modify_list(my_list)
6print(my_list)  # [1, 2, 3, 100]

مثال: وظيفة تقوم بتعديل رقم

من ناحية أخرى، فإن محاولة تعديل كائن غير قابل للتغيير تؤدي إلى إنشاء كائن جديد۔

1def modify_number(n):
2    n += 10
3
4my_number = 5
5modify_number(my_number)
6print(my_number)  # 5 -> unchanged

اعتبارات عملية

تجنب استخدام الكائنات القابلة للتغيير كوسيطات افتراضية

 1# Bad example
 2def add_item(item, container=[]):
 3    container.append(item)
 4    return container
 5
 6print(add_item(1))  # [1]
 7print(add_item(2))  # [1, 2] -> unintended behavior
 8
 9# Good example
10def add_item(item, container=None):
11    if container is None:
12        container = []
13    container.append(item)
14    return container
15
16print(add_item(1))  # [1]
17print(add_item(2))  # [2]

نظرًا لأن الوسيطات الافتراضية يتم تقييمها مرة واحدة فقط عند تعريف الوظيفة، فإن استخدام الكائنات القابلة للتغيير قد يؤدي إلى تأثيرات جانبية غير متوقعة۔

  • في المثال الأول، يتم استخدام نفس كائن القائمة في كل مرة يتم فيها استدعاء add_item۔ عند استدعاء add_item(2) للمرة الثانية، يبقى العنصر 1 الذي أُضيف سابقًا في القائمة، مما يؤدي إلى الحصول على [1, 2]۔
  • في المثال المحسن، يتم استخدام None كقيمة افتراضية، ويتم إنشاء قائمة جديدة داخل الدالة إذا كان الوسيط هو None۔ هذا يضمن إنشاء قائمة جديدة في كل مرة يتم فيها استدعاء الدالة، بحيث لا تؤثر النتائج السابقة على الاستدعاءات اللاحقة۔

تجنب استخدام الكائنات القابلة للتغيير مثل القوائم أو القواميس كوسائط افتراضية؛ وبدلاً من ذلك استخدم None وقم بتهيئتها داخل الدالة۔ هذه ممارسة أساسية ومهمة جداً في لغة بايثون۔

الملخص

لفهم متعمق لمتغيرات وأنواع البيانات في Python، من المهم إدراك الفروقات بين القابل للتغيير وغير القابل للتغيير۔ فهم هذه الخصائص يساعدك على تجنب السلوك غير المقصود في تعليماتك البرمجية وكتابة برامج أكثر قوة وسهولة في القراءة۔

يمكنك متابعة المقالة أعلاه باستخدام Visual Studio Code على قناتنا على YouTube.۔ يرجى التحقق من القناة على YouTube أيضًا.۔

YouTube Video