استدعاء وظائف بايثون حسب المرجع (نسخة مكررة)
في العديد من لغات البرمجة، يمكن تمرير المعلمات حسب القيمة أو بالرجوع باستخدام كلمات محجوزة محددة . ومع ذلك، في بايثون، عندما يتم تمرير معلمة إلى دالة، فإنها لا تقوم أبدًا بتعديل قيمة المتغير الأصلي في وظيفة الاستدعاء.
مثال 1: استدعاء حسب القيمة
k = 2
def foo(n):
n *= n
return n
j = foo(k)
print(j) # 4
print(k) # 2
هنا، تظل قيمة k دون تغيير بعد استدعاء الدالة foo لأن بايثون تقوم بتمرير الوسائط حسب القيمة.
مثال 2: استدعاء بواسطة Global
لتعديل المتغير في وظيفة الاستدعاء، يمكن استخدام الكلمة الأساسية العامة.
n = 0
def foo():
global n
n *= n
return n
في هذه الحالة، تسمح الكلمة الأساسية العامة بتعديل n داخل الدالة foo، وسيتم تحديث قيمتها في دالة الاستدعاء.
تمرير بواسطة مرجع الكائن في ومع ذلك، فإن بايثون
لا تتبع بدقة الاستدعاء حسب القيمة أو الاستدعاء حسب المرجع. بدلًا من ذلك، فإنها تستخدم مفهومًا يسمى "التمرير حسب مرجع الكائن".
في بايثون، تشير المتغيرات إلى الكائنات، وليس الكائنات نفسها. على هذا النحو، عندما يتم تمرير متغير إلى دالة، فإنه يمرر مرجعًا إلى الكائن، وليس الكائن نفسه.
على سبيل المثال:
def append_one(li):
li.append(1)
x = [0]
append_one(x)
print(x) # [0, 1]
في هذا الكود، تقوم الدالة append_one بإلحاق 1 بالقائمة x. نظرًا لأنه يتم تمرير القائمة حسب مرجع الكائن، فإن أي تغييرات يتم إجراؤها على القائمة داخل الوظيفة سوف تنعكس في وظيفة الاستدعاء.
التمرير حسب المرجع مقابل التمرير بواسطة مرجع الكائن
في الختام، تتبع بايثون مرجع الكائن بالمرور، حيث تشير المتغيرات إلى الأشياء بدلاً من الأشياء نفسها. يسمح هذا للوظائف بتعديل الكائنات التي تم تمريرها إليها، ولكن لا يتم نشر التغييرات في مراجع المتغيرات نفسها مرة أخرى إلى وظيفة الاستدعاء.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3