سؤال
هذا السؤال لديه بالفعل إجابة هنا:
أحاول معرفة هذا:
c = 1
def f(n):
print c + n
def g(n):
c = c + n
f(1) => 2
g(1) => UnboundLocalError: local variable 'c' referenced before assignment
شكرًا!
المحلول
داخل الدالة، يتم التعامل مع المتغيرات التي تم تعيينها لها كمتغيرات محلية بشكل افتراضي.لتعيين المتغيرات العامة، استخدم global
إفادة:
def g(n):
global c
c = c + n
هذه واحدة من المجالات الغريبة في لغة بايثون التي لم تناسبني أبدًا.
نصائح أخرى
إن الدولة العالمية أمر يجب تجنبه، وخاصة الحاجة إلى تغييره.فكر فيما إذا g()
يجب أن تأخذ ببساطة معلمتين أو إذا f()
و g()
يجب أن تكون أساليب فئة مشتركة مع c
سمة المثيل
class A:
c = 1
def f(self, n):
print self.c + n
def g(self, n):
self.c += n
a = A()
a.f(1)
a.g(1)
a.f(1)
النواتج:
2
3
خطأ ل مشاركة جريج:
لا ينبغي أن يكون هناك قبل أن تتم الإشارة إليهم.إلق نظرة:
x = 1
def explode():
print x # raises UnboundLocalError here
x = 2
إنه ينفجر، حتى لو تم تعيين x بعد الإشارة إليه.في بايثون، يمكن أن يكون المتغير محليًا أو نطاقًا خارجيًا مرجعيًا، ولا يمكن أن يتغير في دالة واحدة.
بخلاف ما قاله جريج، في Python 3.0، سيكون هناك بيان غير محلي يشير إلى "إليك بعض الأسماء التي تم تعريفها في النطاق المرفق".على عكس الأسماء العالمية، يجب أن تكون هذه الأسماء محددة بالفعل خارج النطاق الحالي.سيكون من السهل تعقب الأسماء والمتغيرات.في الوقت الحاضر لا يمكنك التأكد من تحديد "شيء عالمي" بالضبط.