python - كيفية تغيير متغير بعد أن تم تعريفه بالفعل؟




python-3.x scope (4)

أنت تعدّل متغيرًا تم إنشاؤه في نطاق test() الوظيفة test() . إذا كنت تريد تعديل outter a فيمكنك القيام بما يلي:

a = 15

def test():
    global a
    a = a + 1
    print(a)

test()

أحاول إضافة أو طرح من متغير محدد ، لكن لا يمكنني معرفة كيفية استبدال القيمة القديمة بالقيمة الجديدة.

a = 15

def test():
    a = a +10
    print ( a )

test()

رسالة خطأ:

Traceback (most recent call last):
  File "test.py", line 7, in <module>
    test()
  File "test.py", line 4, in test
    a = a +10
UnboundLocalError: local variable 'a' referenced before assignment

الخطأ الخاص بك لا علاقة له به ، يتم تعريفه بالفعل ... المتغير صالح فقط داخل ما يسمى بالنطاق: إذا قمت بإنشاء متغير في دالة ، فسيتم تعريفها فقط في هذه الوظيفة.

def test():
   x=17
   print(x) # returns 17

test()
print(x) # results in an error.

سأفعل ذلك بهذه الطريقة:

def test(a):
    a = a +10
    return a

print(test(15))

لاحظ أنه في الإصدار المقترح هنا ، هناك بعض الأشياء التي تختلف عن الأشياء الخاصة بك.

أولاً ، ما قمت بتدوينه سيؤدي إلى إنشاء وظيفة لها ، كمدخل ، القيمة a (في هذه الحالة يتم تعيينها على 15 عندما نسميها الوظيفة - المعرفة مسبقًا في السطر الأخير -) ، ثم تعيّن الكائن قيمة a (الذي كان 15) بالإضافة إلى 10 ، ثم تُرجع a (الذي تم تعديله وأصبح الآن 25) ، وأخيراً ، يطبع للخارج بفضل السطر الأخير من الكود:

print(test(15))

لاحظ أن ما قمت به لم يكن في الواقع وظيفة نقية ، إذا جاز التعبير. عادة ما نريد الحصول على وظائف للحصول على قيمة إدخال (أو عدة) وإرجاع قيمة إدخال (أو عدة). في حالتك كان لديك قيمة إدخال فارغة فعليًا وليس لها قيمة إخراج (حيث أنك لم تستخدم الإرجاع ). علاوة على ذلك ، حاولت أن تكتب هذا الإدخال خارج الوظيفة (التي ، عندما قمت بالاتصال بها بقول test(a) ، القيمة التي لم يتم تحميلها أعطت الخطأ - أعاني من الخطأ في أعين الكمبيوتر "فارغة") .

علاوة على ذلك ، أشجعك على التعود على كتابة الإرجاع داخل الوظيفة ثم استخدام الطباعة عند الاتصال بها (تمامًا كما كتبت في آخر سطر ترميز: print(test(15)) ) بدلاً من استخدامها داخل الوظيفة . من الأفضل استخدام الطباعة فقط عند استدعاء الوظيفة وترغب في معرفة ما تقوم به الوظيفة بالفعل.

على الأقل ، هذه هي الطريقة التي أظهروا بها لي في دروس البرمجة الأساسية. يمكن تبرير ذلك على النحو التالي: إذا كنت تستخدم الإرجاع داخل الوظيفة ، فستعطيك الوظيفة قيمة يمكن استخدامها لاحقًا في وظائف أخرى (على سبيل المثال ، تقوم دالة بإرجاع شيء يمكنك العمل معه). وإلا ، فستحصل فقط على رقم معروض على الشاشة مع طباعة ، لكن الكمبيوتر لم يتمكن من العمل معه.

ملاحظة: يمكنك أن تفعل الشيء نفسه عند القيام بذلك:

def test(a):
    a +=10      
    return a

print(test(15))

نطاق المتغير محليًا في الكتلة ما لم يتم تعريفه صراحةً باستخدام الكلمة الأساسية global . هناك طريقة أخرى للوصول إلى المتغير العمومي المحلي إلى دالة باستخدام دالة globals

a = 15

def test():
    a = globals()['a']
    a += 10
    print ( a )

test()

المثال أعلاه سوف يطبع 25 مع الحفاظ على القيمة العالمية سليمة أي 15 .





scope