القائمة 2D لها على شكل غريب عند محاولة تعديل قيمة واحدة [مكررة

StackOverflow https://stackoverflow.com/questions/2739552

  •  02-10-2019
  •  | 
  •  

سؤال

تكرار ممكن:
ميزة غير متوقعة في قائمة القوائم Python

لذلك أنا جديد نسبيًا على Python وأواجه مشكلة في العمل مع قوائم ثنائية الأبعاد.

هذا هو الكود الخاص بي:

data = [[None]*5]*5
data[0][0] = 'Cell A1'
print data

وهنا هو الإخراج (منسق لقدرة على القراءة):

[['Cell A1', None, None, None, None],
 ['Cell A1', None, None, None, None],
 ['Cell A1', None, None, None, None],
 ['Cell A1', None, None, None, None],
 ['Cell A1', None, None, None, None]]

لماذا يتم تعيين القيمة كل صف؟

هل كانت مفيدة؟

المحلول

هذا يجعل قائمة مع خمسة إشارات إلى نفس قائمة:

data = [[None]*5]*5

استخدم شيئًا كهذا بدلاً من ذلك والذي ينشئ خمس قوائم منفصلة:

>>> data = [[None]*5 for _ in range(5)]

الآن يفعل ما تتوقعه:

>>> data[0][0] = 'Cell A1'
>>> print data
[['Cell A1', None, None, None, None],
 [None, None, None, None, None],
 [None, None, None, None, None],
 [None, None, None, None, None],
 [None, None, None, None, None]]

نصائح أخرى

كما مرجع مكتبة بيثون لأنواع التسلسل, يقول ، بما في ذلك القوائم

لاحظ أيضًا أن النسخ ضحلة ؛ لا يتم نسخ الهياكل المتداخلة. هذا في كثير من الأحيان يطارد مبرمجين بيثون الجدد. انصح:

>>> lists = [[]] * 3
>>> lists
  [[], [], []]
>>> lists[0].append(3)
>>> lists
  [[3], [3], [3]]

ما حدث هو أن [[]] هي قائمة عناصر واحدة تحتوي على قائمة فارغة ، لذلك جميع العناصر الثلاثة من [[]] * 3 هي (مؤشرات) هذه القائمة الفارغة الواحدة. تعديل أي من عناصر القوائم يعدل هذه القائمة الفردية.

يمكنك إنشاء قائمة بالقوائم المختلفة بهذه الطريقة:

>>> lists = [[] for i in range(3)]  
>>> lists[0].append(3)
>>> lists[1].append(5)
>>> lists[2].append(7)
>>> lists
  [[3], [5], [7]]

في Python كل متغير هو كائن ، وبالتالي مرجع. قمت أولاً بإنشاء مجموعة من 5 نونس ، ثم تقوم ببناء صفيف مع 5 مرات نفس الكائن.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top