🐍 الفرق بين الأنواع القابلة للتغيير (Mutable) وغير القابلة للتغيير (Immutable) في بايثون
فهم الفرق بين الكائنات القابلة للتغيير وغير القابلة للتغيير أمر أساسي لكتابة كود بايثون فعال وتجنب الأخطاء غير المتوقعة، خاصة عند التعامل مع تمرير الكائنات للدوال أو في العمليات المتوازية.
Immutable Types (أنواع غير قابلة للتغيير):
الكائنات التي لا يمكن تغيير قيمتها بعد إنشائها. إذا قمت بتعيين قيمة جديدة لمتغير يحمل كائنًا غير قابل للتغيير، فأنت في الواقع تقوم بإنشاء كائن جديد وتعيين المتغير ليشير إليه.
أمثلة شائعة:
Mutable Types (أنواع قابلة للتغيير):
الكائنات التي يمكن تغيير محتواها بعد إنشائها دون الحاجة لإنشاء كائن جديد. التغييرات تتم على الكائن الأصلي مباشرة.
أمثلة شائعة:
لماذا هذا مهم؟
عند تمرير كائن Immutable إلى دالة، لا يمكن للدالة تغيير الكائن الأصلي. أما عند تمرير كائن Mutable، فيمكن للدالة تعديله، مما يؤثر على الكائن الأصلي خارج نطاق الدالة.
#Python #Programming #Tutorial #Mutable #Immutable #DataTypes
فهم الفرق بين الكائنات القابلة للتغيير وغير القابلة للتغيير أمر أساسي لكتابة كود بايثون فعال وتجنب الأخطاء غير المتوقعة، خاصة عند التعامل مع تمرير الكائنات للدوال أو في العمليات المتوازية.
Immutable Types (أنواع غير قابلة للتغيير):
الكائنات التي لا يمكن تغيير قيمتها بعد إنشائها. إذا قمت بتعيين قيمة جديدة لمتغير يحمل كائنًا غير قابل للتغيير، فأنت في الواقع تقوم بإنشاء كائن جديد وتعيين المتغير ليشير إليه.
أمثلة شائعة:
int, float, str, tuple, bool, frozenset.# مثال على Immutable Type (str)
my_string = "Hello"
print(f"Original string: {my_string}, ID: {id(my_string)}")
my_string = my_string + " World" # هذا ينشئ كائن string جديد
print(f"Modified string: {my_string}, ID: {id(my_string)}")
my\_tuple = (1, 2, 3)
print(f"Original tuple: {my_tuple}, ID: {id(my_tuple)}")
my_tuple = my_tuple + (4,) # هذا ينشئ كائن tuple جديد
print(f"Modified tuple: {my_tuple}, ID: {id(my_tuple)}")
Mutable Types (أنواع قابلة للتغيير):
الكائنات التي يمكن تغيير محتواها بعد إنشائها دون الحاجة لإنشاء كائن جديد. التغييرات تتم على الكائن الأصلي مباشرة.
أمثلة شائعة:
list, dict, set, bytearray.# مثال على Mutable Type (list)
my_list = [1, 2, 3]
print(f"Original list: {my_list}, ID: {id(my_list)}")
my_list.append(4) # يتم تعديل الكائن الأصلي
print(f"Modified list: {my_list}, ID: {id(my_list)}")
my_dict = {'a': 1, 'b': 2}
print(f"Original dict: {my_dict}, ID: {id(my_dict)}")
my_dict['c'] = 3 # يتم تعديل الكائن الأصلي
print(f"Modified dict: {my_dict}, ID: {id(my_dict)}")
لماذا هذا مهم؟
عند تمرير كائن Immutable إلى دالة، لا يمكن للدالة تغيير الكائن الأصلي. أما عند تمرير كائن Mutable، فيمكن للدالة تعديله، مما يؤثر على الكائن الأصلي خارج نطاق الدالة.
def modify_immutable(value):
value = value + 1 # ينشئ قيمة جديدة، ولا يؤثر على الأصل
return value
def modify_mutable(items):
items.append(10) # يعدل القائمة الأصلية
x = 5
print(f"Before modify_immutable: x = {x}")
x = modify_immutable(x)
print(f"After modify_immutable: x = {x}") # x يتغير لأننا قمنا بإعادة تعيينه
my_list_func = [1, 2]
print(f"Before modify_mutable: my_list_func = {my_list_func}")
modify_mutable(my_list_func)
print(f"After modify_mutable: my_list_func = {my_list_func}") # القائمة الأصلية تتغير
#Python #Programming #Tutorial #Mutable #Immutable #DataTypes