有关变量作用域的简单问题:为什么在主函数中声明的变量可以从外部函数访问?也就是说,为什么下面的代码会打印出“yes”?
def run():
print var
if __name__ == '__main__':
var = 'yes'
run()
有没有办法“关闭”它呢?从编写良好的代码的角度来看,忽略将变量作为参数传递到函数中并仍使您的代码运行是没有帮助的。
在Python中,if语句不会创建新的作用域。没有办法“关闭”它,这是语言工作方式的核心部分。
您可以使用一个主函数将其包装在一个新的作用域中(通常这是您想要做的;避免混乱的命名空间),并从主防护程序中调用它:
def run():
print var
def main():
var = 'yes'
run()
if __name__ == '__main__':
main()
var
没有作为参数传递给 main
函数。 - SimonCWrun
函数吗? - undefined为了帮助未来读者消除任何困惑,让我解释一下这里的背景情况。在楼主的代码中:
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为什么不推荐使用全局变量”。
main
(或其他任何名称)的函数,并仅在if
内部调用它。 - Ry-run()
,当然它可以访问所有外部变量(但不能改变它们)。 - ImportanceOfBeingErnest