Adam Ebrahim نشر 25 مايو 2021 أرسل تقرير نشر 25 مايو 2021 قمت بعمل قائمة كالتالي: Arr = [1, 2, 3] ثم قمت بعمل قائمة جديدة من خلال إسناد الأولى إلى الثانية كالتالي: newList = Arr لكن المشكلة هي أنه عندما أقوم بتعديل القائمة الجديدة أجد أن القائمة القديمة تغيرت أيضًا newList[0] = True print(Arr) # [True, 2, 3] كيف أقوم بتعديل القائمة الجديدة بدون تغيير القائمة القديمة؟ اقتباس
1 عبدالله عبدالرحمن11 نشر 25 مايو 2021 أرسل تقرير نشر 25 مايو 2021 في الحقيقة التعيين Assignment بإستخدام إشارة = لا يقوم بالنسخ للكائنات objects وليس المتغيرات العادية مثل هذا الكود a = 5 b = a b += 1 print(a) # 5 طبع print(b) # 6 طبع ففي هذا الكود تم النسخ لأنها متغيرات عادية وليست كائنات objects أما في الكود الخاص بك عندما قمت newList = Arr هنا لم تقم بالنسخ بل قمت بإنشاء متغير جديد يشير الى مكان المتغير الأول في الذاكرة الآن لديك متغيرين مختلفين بالاسم يشيران الى نفس المكان في الذاكرة أما إذا أردت عمل نسخ للكائنات Object فهناك العديد من الطرق ومنها عمل وظيفة تحتوي على حلقة التكرار بFor وهذا الأمر يأخذ وقت غير ضروري لأن هناك وظائف مدمجة مع بايثون لعمل النسخ لعمل نسخ سطحي Shallow Copy فيمكنك إستخدمه لنسخ الكائنات الذي لا تحتوي على كائنات داخلها كما في الكود import copy Arr = [1, 2, 3] newList = copy.copy(Arr) أما إذا أردت عمل نسخ عميق Deep copy وتستخدمه للكائنات الذي تحتوي على كائنات import copy Arr = [1, 2, 3] newList = copy.deepcopy(Arr) اقتباس
0 Sam Ahw نشر 25 مايو 2021 أرسل تقرير نشر 25 مايو 2021 السبب في ذلك هو أن إشارة = في بايثون لا تقوم بالنسخ، وإنما تقوم بإنشاء ما يدعى binding بين المتغيّرين. لذلك يجب عليك استخدام التالي: arr2 = arr1.copy() مثال: from numpy import * arr1 = array([2, 6, 9, 4]) arr2 = arr1.copy() # إجراء تعديل على أي مصفوفة منهما arr1[1] = 7 وهو ما يدعى ب deep copy. 1 اقتباس
0 Wael Aljamal نشر 25 مايو 2021 أرسل تقرير نشر 25 مايو 2021 يمكننا عمل slice للقائمة الأولى ما يعمل على نسخ القيم لعناصرها بدون أخدهم بالمرجع: old_list = [1,2,3] new_list = old_list[:] new_list[0] = 0 print (new_list) # [0, 2, 3] print (old_list) # [1, 2, 3] ستعيد هذه الطريقة قائمة جديدة غير مرتبطة بالأولى 1 اقتباس
السؤال
Adam Ebrahim
قمت بعمل قائمة كالتالي:
ثم قمت بعمل قائمة جديدة من خلال إسناد الأولى إلى الثانية كالتالي:
لكن المشكلة هي أنه عندما أقوم بتعديل القائمة الجديدة أجد أن القائمة القديمة تغيرت أيضًا
كيف أقوم بتعديل القائمة الجديدة بدون تغيير القائمة القديمة؟
3 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.