主函数中声明的变量作用域是什么?

5

有关变量作用域的简单问题:为什么在主函数中声明的变量可以从外部函数访问?也就是说,为什么下面的代码会打印出“yes”?

def run():
    print var

if __name__ == '__main__':
    var = 'yes'
    run()

有没有办法“关闭”它呢?从编写良好的代码的角度来看,忽略将变量作为参数传递到函数中并仍使您的代码运行是没有帮助的。


2
那不是一个“主函数”;它只是一个if语句。如果你愿意,你可以定义一个名为main(或其他任何名称)的函数,并仅在if内部调用它。 - Ry-
3
误解在于你的代码中没有主函数。唯一存在的函数是run(),当然它可以访问所有外部变量(但不能改变它们)。 - ImportanceOfBeingErnest
2个回答

6

在Python中,if语句不会创建新的作用域。没有办法“关闭”它,这是语言工作方式的核心部分。

您可以使用一个主函数将其包装在一个新的作用域中(通常这是您想要做的;避免混乱的命名空间),并从主防护程序中调用它:

def run():
    print var

def main():
    var = 'yes'
    run()

if __name__ == '__main__':
    main()

这段代码不会打印出 "yes",因为 var 没有作为参数传递给 main 函数。 - SimonCW
2
这是故意的,以显示如果您这样做,变量将不再在范围内。 - Filip Haglund
你是指run函数吗? - undefined

1

为了帮助未来读者消除任何困惑,让我解释一下这里的背景情况。在楼主的代码中:

def run():
    print var

if __name__ == '__main__':
    var = 'yes'
    run()

var在文件的顶层被声明,因此var会自动成为一个全局变量*。然后run()将注意到var存在于全局作用域中,并简单地打印它。

这种行为通常是不希望出现的*,因此解决方案是避免使var成为全局变量。为此,我们需要在函数或类内部声明var。一个例子:

def run():
    print var  # this line will fail, which is what we want

def main():
    var = 'yes'
    run()

if __name__ == '__main__':
    main()

由于var是在函数内部声明的,即在这种情况下main()中,var仅存在于main()的本地作用域中。run()将注意到var不在其自己的本地作用域或全局作用域中,因此它会失败。

*在Python中,任何在顶级声明的变量(意味着它没有在函数或类中声明,它只是公开的)都会自动被视为全局变量。全局变量可以从任何地方访问。这通常是不可取的。这就是为什么好的程序员通常会避免编写顶层代码,而是将所有的代码放在一个主函数或其他函数/类中。

*在这里查看原因。或者只需搜索“Python为什么不推荐使用全局变量”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接