Python 条件本地导入异常
考虑一下这个片段 导入东西 导入系统 打印(系统版本) 定义f(a): b=a 如果a==1: 进口东西Python 条件本地导入异常,python,Python,考虑一下这个片段 导入东西 导入系统 打印(系统版本) 定义f(a): b=a 如果a==1: 进口东西 b*=something.value#一个import x语句做两件事* 它加载(并运行)被引用的模块(如果尚未被引用) 它将模块分配给同名的变量 当a==1时,函数仅将模块something分配给变量something。如果a!=1,即使模块已加载,也未分配给变量,因此无法引用 这就是你所做的失败的原因。这也是为什么您试图做的事情对您毫无好处,因为模块只在第一次导入时加载并运行。接下来的每
b*=something.value#一个
import x
语句做两件事*
a==1
时,函数仅将模块something
分配给变量something
。如果a!=1
,即使模块已加载,也未分配给变量,因此无法引用
这就是你所做的失败的原因。这也是为什么您试图做的事情对您毫无好处,因为模块只在第一次导入时加载并运行。接下来的每一次都只是执行步骤2
代码没有引用全局something
的原因是,如果函数中的任何地方出现同名的局部变量,即使从未访问过,python也会覆盖全局名称。以下函数f
的故障与您的类似
x = 1
def f(y):
if False:
x = y
return x
解决方案是不要将
x
同时用作局部变量和全局变量。如果给定范围内的变量有赋值,则该变量是该范围的局部变量。如果该赋值是有条件的,并且您可以运行代码,使其永远不会发生(或者在被赋值后它在该范围内被引用),那么您将得到这个异常。相同的较小示例:
def f():
if False:
a = 1
print(a)
a = 1
f()
还有必须的FAQ。因为导入语句不能像这样使用,加上您要导入2次,因此您应该在模块中创建一个名为
get\u value()
的函数,然后只返回值。那么您可以在这段代码中调用它。@python中的Hippolippo getter永远都不是答案!它们当然不能解决这里的问题。您需要一个else
来指定如果a!=1
,否则Python需要一个尚未定义的局部变量某物
。我认为这个答案对我来说更有意义。记录在案,尽管已经有一个全局导入,但添加了局部导入是一个疏忽:局部导入确实可以删除(实际上if分支中有更多的代码)。你解释的第二部分启发了我:我忘了有些东西只是另一个变量。
def f():
if False:
a = 1
print(a)
a = 1
f()