合并全局和本地范围

时间:2016-02-08 16:15:05

标签: 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在赋值之前被引用,但它在第一个示例中起作用...

3 个答案:

答案 0 :(得分:3)

在python中,当您分配变量时,声明会自动发生。 因此,当您在函数内部为x赋值时,python认为这是一个新的局部变量,遮蔽全局x

如果您想为全局x分配值,则可以执行此操作:

x=5
def main():
    global x

    x += 1
    print x
main()

答案 1 :(得分:0)

如果没有明确地这样做,你不能在python中分配一个全局变量。通过编写x+=1,您将为x分配值,并隐式声明x为局部变量。但它没有定义,因此你得到一个错误。

循环没有实际效果,因为locals字典为空。

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

答案 2 :(得分:0)

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

x

所以x具有不同的身份。在第二种情况下,本地 HasOptional(t => t.ActivityInstance) .WithRequired(t => t.MsdsDataValidation); 掩盖了全局值,因此x = x + 1会导致错误,因为尚未定义。

来自docs

  

如果名称绑定在块中,则它是该块的局部变量,除非声明为非本地或全局。(...)。如果在代码块中使用了变量但未在其中定义,则为一个自由变量。