يؤدي تعيين وسيطة افتراضية في تعريف دالة Python إلى استخدام القيمة الافتراضية إذا تم حذف الوسيطة أثناء استدعاء دالة.
التفاصيل التالية موصوفة أدناه.
- تعيين الوسيطات الافتراضية
- القيود على موضع الوسيطات الافتراضية
- لاحظ أنه عند استخدام قائمة أو قاموس كقيمة افتراضية
تعيين الوسيطات الافتراضية
إذا كان اسم الوسيطة = القيمة الافتراضية في تعريف الوظيفة ، فسيتم استخدام القيمة الافتراضية عند حذف الوسيطة المقابلة.
def func_default(arg1, arg2='default_x', arg3='default_y'): print(arg1) print(arg2) print(arg3) func_default('a') # a # default_x # default_y func_default('a', 'b') # a # b # default_y func_default('a', arg3='c') # a # default_x # c
القيود على موضع الوسيطات الافتراضية
يؤدي وضع وسيطة افتراضية قبل وسيطة عادية (وسيطة لم يتم تحديد قيمة افتراضية لها) عند تعريف دالة إلى حدوث خطأ.SyntaxError
# def func_default_error(arg2='default_a', arg3='default_b', arg1): # print(arg1) # print(arg2) # SyntaxError: non-default argument follows default argument
لاحظ أنه عند استخدام قائمة أو قاموس كقيمة افتراضية
إذا تم تحديد كائن قابل للتحديث (قابل للتغيير) مثل قائمة أو قاموس كقيمة افتراضية ، فسيتم إنشاء هذا الكائن عند تحديد الوظيفة. ثم ، عندما يتم استدعاء الوظيفة بدون الوسيطة المقابلة ، يتم استخدام نفس الكائن.
يتم تقييم قيم الوسيطة الافتراضية من اليسار إلى اليمين عند تنفيذ تعريف الوظيفة. هذا يعني أنه يتم تقييم تعبير الوسيطة الافتراضي مرة واحدة فقط عند تحديد الوظيفة ، ويتم استخدام نفس القيمة “المحسوبة” لكل استدعاء.
8.7. Function definitions — Python 3.10.2 Documentation
وبالتالي ، على سبيل المثال ، إذا تم تحديد دالة تأخذ قائمة أو قاموسًا كوسيطة افتراضية لها وتضيف عناصر إليها ، وتم استدعاؤها عدة مرات بدون هذه الوسيطة ، فسيتم إضافة العناصر إلى نفس الكائن بشكل متكرر.
مثال على القائمة.
def func_default_list(l=[0, 1, 2], v=3): l.append(v) print(l) func_default_list([0, 0, 0], 100) # [0, 0, 0, 100] func_default_list() # [0, 1, 2, 3] func_default_list() # [0, 1, 2, 3, 3] func_default_list() # [0, 1, 2, 3, 3, 3]
مثال لقاموس.
def func_default_dict(d={'default': 0}, k='new', v=100): d[k] = v print(d) func_default_dict() # {'default': 0, 'new': 100} func_default_dict(k='new2', v=200) # {'default': 0, 'new': 100, 'new2': 200}
يتم إنشاء كائن جديد في كل مرة يتم استدعاء الوظيفة.
def func_default_list_none(l=None, v=3): if l is None: l = [0, 1, 2] l.append(v) print(l) func_default_list_none() # [0, 1, 2, 3] func_default_list_none() # [0, 1, 2, 3]