عند تعريف دالة في Python، القيمة الافتراضية للوسيطات (arguments) تُحفظ مرة واحدة عند تعريف الدالة، وليس عند كل مرة يُستدعى فيها الدالة. في حالة دالتك foo
، قمت بتعريف القيمة الافتراضية للوسيط bar
كقائمة فارغة []
، وعندما يتم استدعاء الدالة foo
بدون تمرير قيمة للوسيط bar
، يُستخدم نفس الكائن bar
الذي تم تعريفه في البداية.
بمعنى آخر، عندما تقوم بتشغيل foo()
لأول مرة، تُضاف “apple” إلى القائمة bar
ويتم إرجاعها. عندما تُشغل foo()
مرة أخرى، يُستخدم نفس الكائن bar
الذي تم إنشاؤه في البداية، ولذلك تمت إضافة “apple” مرة أخرى، وهكذا.
-
حل مشكلة الجمع في برمجة Python24/03/2024
إذا كنت ترغب في الحصول على قائمة جديدة في كل مرة تُستدعى فيها الدالة foo
، يمكنك تعديل الدالة لتأخذ ذلك بعين الاعتبار، على سبيل المثال:
pythondef foo(bar=None):
if bar is None:
bar = []
bar.append("apple")
return bar
باستخدام هذا التعديل، عندما تُستدعى الدالة foo
بدون تمرير قيمة للوسيط bar
، سيتم إنشاء قائمة جديدة فارغة في كل مرة.
المزيد من المعلومات
عندما تقوم بتحديد القيمة الافتراضية لوسيط دالة في Python، يتم تقديم تلك القيمة في وقت تعريف الدالة، وليس في كل مرة يتم فيها استدعاء الدالة دون تحديد قيمة لهذا الوسيط. هذا يعني أن القيمة الافتراضية للوسيط تُحفظ وتُستخدم في كل مرة يتم فيها استدعاء الدالة بدون تحديد قيمة لهذا الوسيط.
في حالة دالتك foo
، قمت بتعريف الوسيط bar
كقائمة فارغة []
، وهذه القائمة تُحفظ عند تعريف الدالة. عندما تُستدعى الدالة foo
بدون تحديد قيمة للوسيط bar
، يُستخدم نفس الكائن bar
الذي تم تعريفه في البداية، وهذا هو السبب في أن “apple” يتم إضافته إلى نفس القائمة في كل مرة تستدعى فيها الدالة foo
بدون تحديد قيمة للوسيط bar
.
لحل هذه المشكلة وجعل كل مرة يتم فيها استدعاء الدالة foo
تنشئ قائمة جديدة، يمكنك تعديل الدالة كما يلي:
pythondef foo(bar=None):
if bar is None:
bar = []
bar.append("apple")
return bar
باستخدام هذا التعديل، عندما تُستدعى الدالة foo
بدون تحديد قيمة للوسيط bar
، سيتم إنشاء قائمة جديدة فارغة في كل مرة.