• 0

كل القوائم تتغير معًا في بايثون

قمت بعمل مجموعة من القوائم بهذه الطريقة:

Arr = [[0] * 5] * 3

وحصلت على النتيجة المرغوبة وهي:

[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

لكن عندما أردت أن أغير أول عنصر فقط كالتالي:

Arr[0][0] = 1

وجدت أن كل أول عنصر في كل قائمة أصبح يساوي 1

[[1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0]]

لم أفهم لماذا حدث هذا الأمر؟ ولا كيفية تعديل أول عنصر فقط؟

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

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


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

إن السبب في هذه النتيجة أن عملية الضرب بعد تشكيل المصفوفة تقوم بتكرار القيمة لنفس الكائن (المصفوفة المكونة من 5 أصفار) وتأخذه بالمرجع بآلية shallow lists.

حيث: في القائمة الأولى لا تُنشئ بايثون 5 كائنات أعداد صحيحة ولكنها تنشئ فقط كائنًا صحيحًا واحدًا وكل مؤشرات المصفوفة تشير إلى كائن int نفسه كما هو موضح في الرسم المرفق و النتيجة في المثال.

بعد تغيير قيمة أحد هذه الأغراض سوف يتم إنشاء غرض منفصل له فقط، وبما أنه كل غرض من الأغراض الخمسة مكرر في 3 قوائم بالمرجع/بالعنوان، سوف يتم تغيير نفس القيمة للعنصر المقابل في جميعهم.

والحل هو إنشاء كل سطر في المصفوفة على حدى:

arr = [[0 for i in range(5)] for j in range(3)]
 

[0][0] = 1
print(arr)
 
[[1, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

صورة توضيحية:

2d_array_changed.png

في الحالة الأولى عند طباعة عناوين الذاكرة لكل مصفوفة ستكون تشير لنفس العنوان:

Arr = [[0] * 5] * 3
Arr[0][0] = 1
print(Arr)

print (id(Arr[0]))
print (id(Arr[1]))
print (id(Arr[2]))

#1221247140608
#1221247140608
#1221247140608

 

2 اشخاص أعجبوا بهذا

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


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

هكذا ...

2021-05-25_01h24_41.png

2 اشخاص أعجبوا بهذا

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


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

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

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

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


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

تسجيل الدخول

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


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