• 0

تعديل قائمة في بايثون يعدل على قائمة أخرى

قمت بعمل قائمة كالتالي:

Arr = [1, 2, 3]

ثم قمت بعمل قائمة جديدة من خلال إسناد الأولى إلى الثانية كالتالي:

newList = Arr

لكن المشكلة هي أنه عندما أقوم بتعديل القائمة الجديدة أجد أن القائمة القديمة تغيرت أيضًا

newList[0] = True
print(Arr)	# [True, 2, 3]

كيف أقوم بتعديل القائمة الجديدة بدون تغيير القائمة القديمة؟

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 1

في الحقيقة التعيين 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

السبب في ذلك هو أن إشارة = في بايثون لا تقوم بالنسخ، وإنما تقوم بإنشاء ما يدعى binding بين المتغيّرين.

لذلك يجب عليك استخدام التالي:

arr2 = arr1.copy()

مثال:

from numpy import *                 

arr1 = array([2, 6, 9, 4])
 
arr2 = arr1.copy()
 
  
# إجراء تعديل على أي مصفوفة منهما
arr1[1] = 7                       
  

وهو ما يدعى ب deep copy.

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 0

يمكننا عمل 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 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن