在使用一个本地模块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。我试图找到一些有关这方面的信息或文档,但迄今为止没有多少成功。有人对这种行为有更多的信息/见解吗?在
谢谢
你现在遇到的问题只是重述了python处理掩蔽全局变量的局部变量的方法。在
要理解它,
import foo
是(大约)语法上的甜点:因此,您的代码是:
^{pr2}$由于名称
logging
出现在bar内赋值语句的左侧,因此它被视为局部变量引用,因此python不会在该范围内寻找同名的全局变量,即使设置它的行永远不能被调用。在处理全局变量的常用方法是:使用其他名称,如您所发现的,或者:
这样python就不会认为
logging
是本地的。在通过}作为局部变量,并在初始化之前调用该局部变量。在
import
语句,您在函数中引入{相关问题 更多 >
编程相关推荐