سؤال

الاعتذار، مشوشة إلى حد ما بايثون مبتدئ السؤال. دعنا نقول أن لدي وحدة تسمى animals.py.......

globvar = 1

class dog: 
   def bark(self):
      print globvar

class cat:
   def miaow(self):
      print globvar

ما هو الفرق بين هذا و

class dog:
   def __init__(self):
      global globvar

   def bark(self):
      print globvar

class cat:
   def miaow(self):
      print globvar

على افتراض أنني دائما إنشاء كلب أولا؟

أعتقد أن سؤالي هو، هل هناك أي فرق؟ في المثال الثاني، يقوم ببدء dog إنشاء مستوى وحدة globvar تماما مثل في المثال الأول، سوف تتصرف نفس الشيء ولدي نفس النطاق؟

هل كانت مفيدة؟

المحلول

global لا ينشئ متغير جديد، فهذا فقط يجب أن يشير هذا الاسم إلى متغير عالمي بدلا من محلي. عادة ما يتم التعيينات إلى المتغيرات في وظيفة / فئة / ... الرجوع إلى المتغيرات المحلية. على سبيل المثال، تأخذ وظيفة مثل هذا:

def increment(n)
  # this creates a new local m
  m = n+1
  return m

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

def increment(n)
  global increment_calls
  increment_calls += 1
  return n+1

في حالتك global في المنشئ لا يخلق أي متغيرات، محاولات أخرى للوصول إليها globvar يفشل:

>>> import animals
>>> d = animals.dog()
>>> d.bark()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "animals.py", line 7, in bark
    print globvar
NameError: global name 'globvar' is not defined

ولكن إذا كنت تقوم بالفعل بتعيين قيمة ل globvar في المنشئ، سيتم إنشاء متغير عالمي من الوحدة النمطية عند إنشاء كلب:

class dog:
   def __init__(self):
      global globvar
      globvar = 1
...

تنفيذ:

>>> import animals
>>> d = animals.dog()
>>> d.bark()
1
>>> print animals.globvar
1

نصائح أخرى

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top