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

السؤال

نشر

السلام عليكم 

لو سمحتم لدي سؤال في لغة بايثون

عملت list تحوي على random value
وحفظتها في متغير LISTRANDOM

بعدين ناديت فينكشن insertionSort تعمل على ترتيب القيم ومررت اللست فيها وحفظتها في متغير inseartion_sort

بعد ما عملت هذه الخطوة لما أطبع LISTRANDOM تطلع اللست مرتبه بالرغم أنا ما حفظت التغير فيها...حفظته في متغير ثاني...
فما هو السبب؟وكيف يمكن حل هذه المشكلة فأنا لا أريد أن يحدث تغير في  قيم LISTRANDOM فقط يكون في  inseartion_sort

Screenshot 2022-10-28 113704.png

Recommended Posts

  • 1
نشر

يبدو أن التابع insertionSort يقوم بالتعديل على المتحول بشكل مباشر (بالإضافة إلى أنه يعيده).

لتجنب ذلك هناك أكثر من حل، أولاً في حال كان التابع insertionSort متاح لديك، أي أنك من قام بكتابته، فيمكنك تعديل التابع لكي يضع الناتج في مصفوفة جديدة بدل التعديل على القديمة.

الحل الثاني و هو الحل الإجباري في حال لم يكن لديك وصول إلى التعريف الخاص بالتابع، و هو القيام بتمرير نسخة من المصفوفة بدل المصفوفة نفسها.

سأضع مثال يقوم بالتعديل و سأريك كيف نقوم بالتحويل و يمكنك تطبيق نفس المبدأ على التابع الخاص بك.

def increase(a):
	for i in range(len(a)):
		a[i] += 1
	return a
	
a = [1, 2, 3, 4]
b = increase(a)
print(a)
# [2, 3, 4, 5]
print(b)
# [2, 3, 4, 5]

نلاحظ هنا أننا نقوم بالتعديل على المصفوفة بشكل مباشر و هذا ما سبب الخطأ، و لكن يمكننا تمرير نسخة من المصفوفة كما يلي، و لن يحدث تعديل على الأصلية:

def increase(a):
	for i in range(len(a)):
		a[i] += 1
	return a
	
a = [1, 2, 3, 4]
b = increase(a[:])
print(a)
# [1, 2, 3, 4]
print(b)
# [2, 3, 4, 5]

حيث أننا قمنا بنسخ المصفوفة عن طريق نسخ كافة العناصر باستعمال [:] و هو عملية slice تأخذ كافة عناصر المصفوفة.

الطريق الثانية هو تغيير طريقة تعريف التابع لكي يتم التعديل على نسخة من المصفوفة بدل المصفوفة نفسها:

def increase(a):
	b = []
	for i in range(len(a)):
		b.append(a[i] + 1)
	return b
	
a = [1, 2, 3, 4]
b = increase(a)
print(a)
# [1, 2, 3, 4]
print(b)
# [2, 3, 4, 5]

هنا قمنا بإضافة النتيجة إلى لائحة جديدة و إعادتها بدل التعديل مباشرة على المصفوفة الممررة.

الطريقة الثانية مفضلة على الطريقة الأولى و ذلك ﻷنها تتجنب ما يسمى بالتأثيرات الجانبية و التي تجعل الأخطاء التي تحدث في الكود صعبة التعقب.

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...