合并全局和局部作用域

2024-04-29 10:04:57 发布

您现在位置:Python中文网/ 问答频道 /正文

如果这管用的话

x=5
def main():
    for globe in locals():
        globals().update(locals()[globe])
    print x
main()

那为什么不呢?你知道吗

x=5
def main():
    for globe in locals():
        globals().update(locals()[globe])
    x+=1
    print x
main()

后一个语句中的错误声明x在赋值之前被引用,但是它在第一个示例中起作用。。。你知道吗


Tags: in声明示例formaindef错误update
3条回答

在这两个函数的后缀1和2中,可以找到本地名称(Python2中的语法略有不同):

In [7]: main1.__code__.co_varnames
Out[7]: ('globe',)

In [8]: main2.__code__.co_varnames
Out[8]: ('globe', 'x')

所以x有不同的地位。在第二种情况下,局部的x屏蔽了全局的,因此x=x+1导致了错误,因为还没有定义。你知道吗

docs

If a name is bound in a block, it is a local variable of that block, unless declared as nonlocal or global.(...).If a variable is used in a code block but not defined there, it is a free variable.

在python中,当您指定一个变量时,声明会自动发生。 因此,当您将值赋给函数内的x时,python认为这是一个新的局部变量,隐藏了全局x。你知道吗

如果要为全局x赋值,可以执行以下操作:

x=5
def main():
    global x

    x += 1
    print x
main()

在python中,如果不显式地指定全局变量,则不能这样做。通过编写x+=1,您为x赋值,并隐式地将x声明为局部变量。但是它没有被定义,因此你会得到一个错误。你知道吗

循环没有实际效果,因为locals字典是空的。你知道吗

如果您想在Python中使用全局变量(您不应该这样做,但那是另一回事),那么应该使用global关键字。你知道吗

相关问题 更多 >