在条件句中声明变量是否存在问题?

时间:2017-09-15 19:14:04

标签: python conditional-statements

在条件的所有可能分支中重新定义变量之前,它是否可以防止定义变量?

例如,这段代码应该是:

    # Condition could fail
    try:
        textureIndices = someExpression()

    # textureIndices is defined here if it does
    except:
        textureIndices = []

    return textureIndices

重写为:

    # textureIndices is defined early and then re-defined in the conditional
    textureIndices = None

    try:
        textureIndices = someExpression()


    except:
        textureIndices = 66

    return textureIndices

或者,因为except打开了其他问题,这里textureIndices的定义是否存在问题:

if condition:
    textureIndices = someExpression()

else:
    textureIndices = 66

return textureIndices 

减少问题?

唯一的区别在于第二个版本textureIndices是在条件之外定义的。

我不明白为什么这很重要因为textureIndices不可能在条件中没有赋值,但我可以从管家角度看出为什么知道变量被分配给某些东西是件好事。

例如如果在第一个示例中没有except语句,那么textureIndices将不会被定义,而return会导致错误。

但是,如果没有转发定义在条件的两个原因中定义的变量,是否存在问题?

2 个答案:

答案 0 :(得分:4)

一个原因是它会创建冗余代码。在这种情况下,它似乎不是很明显,但举一个例子,你有多个唯一的except语句在代码中捕获多个异常。想象一下,如果有人想重构您的代码或添加其他除语句。

textureIndices = None

try :
    textureIndices = [thing for thing in func()]fail

except InvalidTextException:
    textureIndices = []
    #lines to handle specific exception
except ValueError:
     textureIndices = []
     #lines to handle specific exception
except OSError:
     textureIndices = []
     #lines to handle specific exception

return textureIndices

如果您有多个行为方式的变量,您可以看到它如何快速升级。通过首先声明基本情况,可以减少冗余。

textureIndices = []

try :
    textureIndices = [thing for thing in func()]fail

except InvalidTextException:
    #lines to handle specific exception
except ValueError:
     #lines to handle specific exception
except OSError:
     #lines to handle specific exception

return textureIndices

答案 1 :(得分:3)

创建变量时,会修改变量字典(localsglobals,具体取决于范围)。

在一种情况下,你创建变量,然后修改它,无论分支如何:1创建+分配,1分配(完全覆盖旧值)。

在省略预先创建的情况下,您只有1个创建+分配,因此从技术上来说,它更快而不是在分支之前声明它(少一个字典查找,一个没那么无用的任务)

除了帮助Python IDE完成分支中的变量名称之外,我会说先前的声明在这种情况下是无用的甚至是麻烦的,因为两个分支都被覆盖(可能是旧的编译语言编程反射)。它可能有兴趣的唯一情况是一组复杂的分支,你只在几个分支中设置变量。我的情况就是这样。