【问题标题】:Scope of variables declared in main function?主函数中声明的变量范围?
【发布时间】:2016-12-09 12:41:05
【问题描述】:

关于变量作用域的简单问题:为什么在主函数中声明的变量可以从外部函数访问? IE。为什么以下打印“是”?

def run():
    print var

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

有没有办法“关闭它”?就编写好的代码而言,忽略将变量作为参数传递给函数并仍然让您的代码运行是没有帮助的。

【问题讨论】:

  • 这不是“主要功能”;这只是一个 if 语句。你可以定义一个名为main(或其他任何东西)的函数,如果你愿意,只在if内调用它。
  • 误解是你的代码中没有 main 函数。唯一的功能是run()run当然可以查看所有外部变量(尽管不能更改它们)。

标签: python variables scope


【解决方案1】:

If 语句不会在 Python 中创建新范围。没有办法“关闭它”;它是语言工作方式的核心部分。

您可以使用 main 函数将其包装在新范围内(这通常是您想要做的;避免使命名空间混乱)并从您的 main-guard 调用它:

def run():
    print var

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

if __name__ == '__main__':
    main()

【讨论】:

  • 此代码不会打印“yes”,因为var 没有作为参数传递给main 函数。
  • 这是故意的,如果你这样做,表明变量不再在范围内
【解决方案2】:

为了让未来的读者产生困惑,让我在这里解释一下幕后发生的事情。在 OP 的代码中:

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 中,任何在顶层声明的变量(意味着它没有在函数或类中声明,它只是公开的)被自动视为全局变量。全局变量可以从任何地方访问。这通常是不希望的。这就是为什么优秀的程序员通常会避免编写顶级代码,而只是将所有代码放在 main() 函数或其他函数/类中。

*See why here。或者只是谷歌“python为什么不需要全局变量”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-31
    • 2020-03-18
    • 2014-09-20
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 2012-06-28
    相关资源
    最近更新 更多