سؤال

أنا أتطلع إلى تهيئة مصفوفة/قائمة من الكائنات غير الفارغة - يقوم مُنشئ الفصل بإنشاء البيانات.في C++ وJava سأفعل شيئًا مثل هذا:

Object lst = new Object[100];

لقد قمت بالبحث، ولكن هل هناك طريقة بايثونية لإنجاز هذا؟

هذا لا يعمل كما اعتقدت (أحصل على 100 مرجع لنفس الكائن):

lst = [Object()]*100

ولكن يبدو أن هذا يعمل بالطريقة التي أريدها:

lst = [Object() for i in range(100)]

يبدو فهم القائمة (فكريًا) مثل "الكثير" من العمل لشيء بسيط جدًا في Java.

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

المحلول

وليس هناك وسيلة للاتصال ضمنيا على منشئ Object() لكل عنصر من عناصر مجموعة مثل يوجد في C ++ (أذكر أنه في جاوة، وinitialised كل عنصر من عناصر مجموعة جديدة لnull لأنواع المرجع).

وأود أن أقول إن من طريقة قائمة على الفهم هو الأكثر Pythonic:

lst = [Object() for i in range(100)]

إذا كنت لا ترغب في خطوة على i متغير معجمية، ثم اتفاقية في بيثون هو استخدام _ لمتغير وهمية قيمتها لا يهم:

lst = [Object() for _ in range(100)]

لما يعادلها من بناء مماثل في جافا، يمكنك استخدام بالطبع *:

lst = [None] * 100

نصائح أخرى

يجب أن تلاحظ أن Python's Equvalent لرمز Java (إنشاء مجموعة من 100 باطل مراجع للكائن):

Object arr = new Object[100];

أو كود C++:

Object **arr = new Object*[100];

يكون:

arr = [None]*100

لا:

arr = [Object() for _ in range(100)]

والثاني سيكون هو نفسه جافا:

Object arr = new Object[100];
for (int i = 0; i < arr.lenght; i++) {
    arr[i] = new Object();
}

في الواقع، تعد قدرات Python على تهيئة هياكل البيانات المعقدة أفضل بكثير من قدرات Java.


ملحوظة:كود سي++:

Object *arr = new Object[100];

سيتعين عليها القيام بقدر كبير من العمل مثل فهم قائمة بايثون:

  • تخصيص ذاكرة مستمرة لـ 100 كائن

  • استدعاء Object::Object() لكل من هذه الكائنات

وستكون النتيجة بنية بيانات مختلفة تمامًا.

وأعتقد أن قائمة على الفهم هو أبسط وسيلة، ولكن إذا كنت لا تحب ذلك، فإنه من الواضح ليست الطريقة الوحيدة للحصول على ما لكم الرغبة - استدعاء نظرا للاستدعاء 100 مرة بدون وسائط لتشكيل 100 عنصر قائمة جديدة. على سبيل المثال، يمكن itertools تفعل ذلك واضح:

>>> import itertools as it
>>> lst = list(it.starmap(Object, it.repeat((), 100)))

وأو، إذا كنت حقا تقليدي، map وapply:

>>> lst = map(apply, 100*[Object], 100*[()])

لاحظ أن هذا هو في الأساس نفسه (صغيرة، سواء في الواقع ؛-) حجم العمل سيستغرق إذا، بدلا من الحاجة ليتم استدعاؤها من الناحية النظرية وبدون وسائط، Object اللازمة ليتم استدعاؤها مع وسيطة واحدة - أو، كما يقول ، إذا كان Object في الواقع وظيفة بدلا من نوع.

ومن مفاجأة لكم أنه قد يستغرق "بقدر ما هي قائمة على الفهم" لتنفيذ هذه المهمة، التي يبدو أنها تعتقد أن كل لغة يجب أن حالة خاصة الحاجة لتنفيذ "تدعو إلى نوع، بدون وسائط" على أنواع أخرى من يدعو إلى أكثر من callables، ولكن لا أستطيع أن أرى ما هو حاسم جدا وخاصة حول هذه القضية محددة للغاية، لتبرير التعامل معها بشكل مختلف عن الآخرين. ونتيجة لذلك، أنا سعيد جدا، شخصيا، أن بيثون لا إفراد هذه القضية واحدة من أصل لتلقي العلاج غريبة وغريبة، ولكن يعالج تماما كما بانتظام وسهولة مثل أي أخرى حالة استخدام مماثلة! -)

lst = [Object() for i in range(100)]

ومنذ مصفوفة هو هو نفسه أول كائن فئة في بيثون وأعتقد أن هذا هو السبيل الوحيد للحصول على ما كنت أبحث عنه. * لا شيء مجنون.

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