函数内部的python import隐藏现有变量

2024-10-01 11:34:22 发布

您现在位置:Python中文网/ 问答频道 /正文

在使用一个本地模块slimbing“之前,本地模块引用了一个奇怪的本地赋值:在使用一个本地模块slimbing”之前,我引用了一个本地变量:

import logging

def foo():
    logging.info('foo')

def bar():
    logging.info('bar')
    if False:
        import logging.handlers
        # With these alternatives things work:
        # import logging.handlers as logginghandlers
        # from logging.handlers import SocketHandler

logging.basicConfig(level=logging.INFO)
foo()
bar()

其输出如下(我尝试了python 2.7和3.3):

^{pr2}$

显然,函数内的import语句会隐藏函数作用域中已存在的同名变量,即使导入没有执行。在

这感觉违反直觉,也不象Python。我试图找到一些有关这方面的信息或文档,但迄今为止没有多少成功。有人对这种行为有更多的信息/见解吗?在

谢谢


Tags: 模块函数importinfo信息falseiffoo
2条回答

你现在遇到的问题只是重述了python处理掩蔽全局变量的局部变量的方法。在

要理解它,import foo是(大约)语法上的甜点:

foo = __import__("foo")

因此,您的代码是:

^{pr2}$

由于名称logging出现在bar内赋值语句的左侧,因此它被视为局部变量引用,因此python不会在该范围内寻找同名的全局变量,即使设置它的行永远不能被调用。在

处理全局变量的常用方法是:使用其他名称,如您所发现的,或者:

def bar():
    global logging
    logging.info('bar')
    if False:
        import logging.handlers

这样python就不会认为logging是本地的。在

通过import语句,您在函数中引入{}作为局部变量,并在初始化之前调用该局部变量。在

def bar():
    import logging.handlers
    print locals()

>>> foo()
{'logging': <module 'logging' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/logging/__init__.pyc'>}

相关问题 更多 >