القائمة 2D لها على شكل غريب عند محاولة تعديل قيمة واحدة [مكررة
-
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 مرات نفس الكائن.