اذهب إلى المحتوى

السؤال

نشر

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

Arr = [1, 2, 3]

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

newList = Arr

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

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

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

Recommended Posts

  • 0
نشر

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

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

arr2 = arr1.copy()

مثال:

from numpy import *                 

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

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

  • 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
نشر

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

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...