我有可怕的麻烦试图了解蟒蛇作用域规则。

使用下面的脚本:

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()

给出意想不到(我)的输出:

    Before setA
    Value of a is 7
    Inside setA, a is now 42
    After setA
    Value of a is 7

在哪里我期望的值的最后一个印刷是42,而不是7。我错过了Python的作用域规则的全局变量的作用域?

有帮助吗?

解决方案

全局变量是特殊的。如果你试图给一个变量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

请参阅也命名和结合 Python的命名和绑定规则。

其他提示

在特技理解这是因为当分配给一个变量,使用=,还声明为一个局部变量。因此,而不是改变所述全局变量a的值,组A(值)实际上设置局部变量(恰好被称为),以在传递的值。

如果你试图从组A(值),像这样的开始打印的价值,这一点就更明显

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

如果您尝试运行此Python将会给您一个错误:

Traceback (most recent call last):
  File "scopeTest.py", line 14, in 
    setA(42)
  File "scopeTest.py", line 7, in setA
    print "Before assignment, a is %d" % (a)
UnboundLocalError: local variable 'a' referenced before assignment

这告诉我们,Python已经决定了组A(值)函数有一个叫做局部变量,这是当你分配给它的功能你改变什么。如果不分配给在函数(与printA())然后Python使用全局变量A

要标记为全球需要使用Python中的全球关键字的变量,中要使用全局变量的范围。在这种情况下是组A(值)函数内。因此,字迹变得:

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()

这一条线除了告诉Python当您使用变量在你所谈论的全局变量,而不是一个局部变量。

的组A(值)函数

Python没有的变量作为其他语言的概念。你有哪些是“某处”的对象,你必须对这些对象的引用。 =用于对这些对象分配给在引用的电流的命名空间。

您在组A功能是指,其值是指所述对象的名称空间创建的名称的。

在函数内部,被视为一个局部变量,需要定义结果

  

全球一个

该函数内

一个函数的执行引入用于该函数的局部变量新符号表。更确切地说,在一个函数的所有变量分配存储在本地符号表中的值;而变量引用先在局部符号表,然后在封闭函数的局部符号表,然后是全局符号表,终于在内置名称表。因此,全局变量不能直接分配的功能(除非在全局语句命名)的值,尽管它们可以被引用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top