لماذا تعين لمتغيراتي العالمية لا تعمل في بيثون؟

StackOverflow https://stackoverflow.com/questions/929777

  •  06-09-2019
  •  | 
  •  

سؤال

أواجه مشكلة فظيعة في محاولة لفهم قواعد تراكم بيثون.

مع البرنامج النصي التالي:

a = 7

def printA():
    print "Value of a is %d" % (a)

def setA(value):
    a = value
    print "Inside setA, a is now %d" %(a)


print "Before setA"
printA()
setA(42)
print "After setA"
printA()

يعطي إخراج غير متوقع (بالنسبة لي) من:

 قبل Seta قيمة A هو 7 داخل Seta، A الآن 42 بعد قيمة Seta A.

حيث أتوقع الطباعة الأخيرة من قيمة A لتكون 42، وليس 7. ما الذي أفتقده حول قواعد نطاق بيثون لتخليص المتغيرات العالمية؟

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

المحلول

المتغيرات العالمية خاصة. إذا حاولت تعيين متغير a = value داخل وظيفة، فإنه يخلق متغيرا محليا جديدا داخل الوظيفة، حتى لو كان هناك متغير عالمي بنفس الاسم. بدلا من ذلك الوصول إلى المتغير العالمي، أضف أ global بيان داخل الوظيفة:

a = 7
def setA(value):
    global a   # declare a to be a global
    a = value  # this sets the global value of a

أنظر أيضا تسمية وملزمة للحصول على شرح مفصل لقواعد تسمية وملزمة بيثون.

نصائح أخرى

الحيلة لفهم هذا هو أنه عند تعيين متغير، باستخدام =، فإنك تعلن أيضا أنه متغير محلي. لذلك بدلا من تغيير قيمة المتغير العالمي A، تقوم Seta (القيمة) بتضبط متغير محلي (يحدث أن يسمى A) إلى القيمة التي تم تمريرها.

يصبح هذا أكثر وضوحا إذا حاولت طباعة قيمة A في بداية Seta (القيمة) مثل ذلك:

def setA(value):
    print "Before assignment, a is %d" % (a)
    a = value
    print "Inside setA, a is now %d" % (a)

إذا حاولت تشغيل هذا Python، فسوف يمنحك خطأ مفيدا:

Traceback (استدعاء الأحدث الماضي): ملف "Scopetest.py"، السطر 14، في ملف Seta (42) ملف "Scopetest.py"، السطر 7، في طباعة Seta "قبل المهمة، A IS٪ D"٪ (أ) unboundlocalerror : المتغير المحلي "a" المشار إليها قبل المهمة

يخبرنا هذا أن Python قررت أن وظيفة Seta (القيمة) تحتوي على متغير محلي يسمى A، وهو ما تتغير عند تعيينه إليه في الوظيفة. إذا لم تقم بتعيينه في الوظيفة (كما هو الحال مع Printa ()) ثم يستخدم Python المتغير العالمي A.

لتمييز متغير باسم عالمي تحتاج إلى استخدام الكلمة الأساسية العالمية في Python، في النطاق الذي تريد استخدام المتغير العالمي. وبعد في هذه الحالة داخل وظيفة Seta (القيمة). لذلك يصبح البرنامج النصي:

a = 7

def printA():
    print "Value of a is %d" % (a)

def setA(value):
    global a
    a = value
    print "Inside setA, a is now %d" %(a)


print "Before setA"
printA()
setA(42)
print "After setA"
printA()

يروي هذا الإضافة السطرية هذه ثعبان أنه عند استخدام المتغير A في وظيفة Seta (القيمة) التي تتحدث عن المتغير العالمي، وليس متغيرا محليا.

ليس لدى Python مفهوم المتغيرات بلغات أخرى. لديك كائنات "في مكان ما" ولديك إشارات إلى هذه الكائنات. = يستخدم لتعيين هذه الكائنات إلى المراجع في حاضر مساحة الاسم.

يمكنك إنشاء اسم A في مساحة اسم وظيفة Seta التي تشير إلى الكائن الذي يشير إليه القيمة.

داخل الوظيفة،أ يتم التعامل معها كمتغير محلي، تحتاج إلى تحديد

العالمية

داخل الوظيفة

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

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