【问题标题】:Why does this python code work?为什么这个 python 代码有效?
【发布时间】:2012-01-05 00:15:57
【问题描述】:

我写了一个简单的python模块,它有这样的代码:

_log = logging.getLogger("mymodule")
_started = False

def set_log_level(level):
    _log.setLevel(level)
    if not _started:
        _hdlr = logging.FileHandler('mymodule.log')

当我调用set_log_level() 时,程序失败,因为找不到符号_started。这是正常的,因为方法中缺少global _started。但是我的问题是:符号_log_started的可见性一样,那为什么能找到这个符号呢?

【问题讨论】:

  • 如果我在 Python 2.7.1 下运行它,我不会收到任何错误。我添加了一行set_log_level(3)
  • 它不应该失败。这就是所有代码吗?
  • 这是你的全部代码吗?您实际运行的代码中是否有类似_started = True 的内容? Python 函数中存在的赋值会影响全局,即使赋值出现在第一次使用之后。
  • @GregHewgill 是对的!我想念sn-p中的那些行。此行将 _started 转换为局部变量,这就是需要 global _started 的原因。

标签: python module visibility globals


【解决方案1】:

我不认为您的程序因您认为的原因而失败。除非您实际修改该变量,否则无需在函数中使用 global 声明。 (否则,您需要使用 global 来访问该命名空间中的某些内容,甚至调用其他函数。)

我不确定当您运行程序时实际发生了什么 - 也许您可以提供问题的回溯或描述。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-17
    • 2014-09-28
    相关资源
    最近更新 更多