تحية ، الخبروفيت! تحسبا لإطلاق موضوع جديد في الدورة التدريبية 
"مطور الويب في بيثون" ، نريد مشاركة ترجمة مفيدة جديدة. دعنا نذهب!
 بعد أن
بعد أن ذهبت إلى عدة مقابلات 
مرة أخرى واجتازت مهام الاختبار ، لاحظت أن من يجرون المقابلات يحبون المهام مثل ما يلي.
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] 
استنتاج
لذلك قمت بإجراء واحدة من المهام الأكثر شعبية اختبار للمقابلة. يهدف هذا المنشور إلى إظهار أنه لا يمكنك دائمًا الاعتماد على حدسك ، كما أفعل بنفسي :-).
نأمل أن تكون هذه الترجمة مفيدة لك. تقليديا ، نحن في انتظار التعليقات ونراكم في 
الدورة .