Python وحدة Globals مقابل __init__ Globals
سؤال
الاعتذار، مشوشة إلى حد ما بايثون مبتدئ السؤال. دعنا نقول أن لدي وحدة تسمى 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__
غير ذي صلة - إنه يفعل ليس قم بإنشاء العالم، لأنه لا يعين أي شيء له.