Python 条件本地导入异常

Python 条件本地导入异常,python,Python,考虑一下这个片段 导入东西 导入系统 打印(系统版本) 定义f(a): b=a 如果a==1: 进口东西 b*=something.value#一个import x语句做两件事* 它加载(并运行)被引用的模块(如果尚未被引用) 它将模块分配给同名的变量 当a==1时,函数仅将模块something分配给变量something。如果a!=1,即使模块已加载,也未分配给变量,因此无法引用 这就是你所做的失败的原因。这也是为什么您试图做的事情对您毫无好处,因为模块只在第一次导入时加载并运行。接下来的每

考虑一下这个片段

导入东西 导入系统 打印(系统版本) 定义f(a): b=a 如果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()