تحية ، الخبروفيت! تحسبا لإطلاق موضوع جديد في الدورة التدريبية
"مطور الويب في بيثون" ، نريد مشاركة ترجمة مفيدة جديدة. دعنا نذهب!
بعد أن ذهبت إلى عدة مقابلات
مرة أخرى واجتازت مهام الاختبار ، لاحظت أن من يجرون المقابلات يحبون المهام مثل ما يلي.
def f(x, l=[]): for i in range(x): l.append(i * i) return l >>> f(2) >>> f(3, [0, 1, 2]) >>> f(3)
السؤال: ما سوف يخرج هذا الرمز؟
إخراج السطرين الأولين واضح تمامًا ، لكن نتيجة السطر الثالث
f(3)
لم تكن واضحة جدًا بالنسبة لي. دعونا نرى ما يحدث بعد تهيئة الوظيفة
f
. لتشغيل هذا الرمز ،
سأستخدم IPython .
>>> f <function __main__.f(x, l=[])> >>> f.__defaults__ ([],)
القائمة الفارغة التي نراها من نتيجة تنفيذ
f.__defaults__
هي المتغير
l
في رمز الوظيفة.
>>> f(2) [0, 1]
لا شيء خاص.
>>> f <function __main__.f(x, l=[0, 1])> >>> f.__defaults__ ([0, 1],)
ولكن! الآن نرى أن المتغير
l
له القيمة
[0, 1]
بسبب تباين كائن القائمة في Python وتمرير وسيطات الدالة كمرجع.
>>> f(3, [0, 1, 2]) [0, 1, 2, 0, 1, 4] >>> f <function __main__.f(x, l=[0, 1])>
لا شيء خاص أيضا. مجرد تمرير كائن
list
كمتغير
l
.
>>> f(3) [0, 1, 0, 1, 4] >>> f <function __main__.f(x, l=[0, 1, 0, 1, 4])>
والآن الأكثر إثارة للاهتمام. عند تشغيل
f(3)
، لا يستخدم Python القائمة الفارغة التي تم تعريفها في رمز الوظيفة ، ويستخدم المتغير
l
مع القيم من
f.__defaults__ ([0, 1])
.
PSإذا كنت بحاجة إلى وظيفة تستخدم قائمة فارغة بعد كل مكالمة ، فيجب عليك استخدام شيء من هذا القبيل (عيّن قيمة
'l'
إلى
'None'
).
def f(x, l=None): if l is None: l = [] for i in range(x): l.append(i * i) return l >>> f(2) [0, 1] >>> f(3, [0, 1, 2]) [0, 1, 2, 0, 1, 4] >>> f(3) [0, 1, 4]
استنتاج
لذلك قمت بإجراء واحدة من المهام الأكثر شعبية اختبار للمقابلة. يهدف هذا المنشور إلى إظهار أنه لا يمكنك دائمًا الاعتماد على حدسك ، كما أفعل بنفسي :-).
نأمل أن تكون هذه الترجمة مفيدة لك. تقليديا ، نحن في انتظار التعليقات ونراكم في
الدورة .