1

我有一些具有这种一般结构的代码:

def runSolver():
    global a
    global b
    while (condition) :
        # do some stuff
        recalculateIntermediateParameters()
        # do more stuff
    return result

def recalculateIntermediateParameters():
    # read globals
    # calculate
    return recalculatedParameter

# main
if __name__="__main__":
    runSolver()

我想知道这是否是最好的实现。例如,在函数中声明全局变量是不好的做法吗?我知道在 Java 中,最好在任何函数定义之外声明全局变量。

我的想法是,这在语法上会“更好”:

def runSolver():
    a = foo
    b = bar
    # do some stuff
    return result

def recalculateIntermediateParameters(a, b):
    # do some stuff
    return recalculatedParameter

但是如果a并且b读取而不被函数操作呢?这会影响全球布局吗?此外,如果ab是冗长的列表怎么办?从性能的角度来看,将值从函数传递到函数是否有意义?哪种范式在“pythonic”代码和性能之间提供了最佳折衷?

4

1 回答 1

6

当您在函数中更改它时,您需要声明一个标识符是全局的。如果您只引用a而不b分配给它们,则可以省略这些global语句。

例如,函数也是全局的。recalculateIntermediateParameters没有被分配给,只是被引用,你不需要使用global recalculateIntermediateParameters就可以这样做。

Python 使用不同的操作码分配给本地和全局。如果你这样做:

def foo():
    a = 10

相对

def foo():
    global a
    a = 10

Python 使用两种不同的操作来更新a为本地或全局。

更一般地说,您希望避免使用全局变量来传递state。将值作为参数传递(使用原语,或复合结构,如字典或自定义类实例)。它使您的代码更易于阅读和调试,因为您可以通过函数跟踪状态,而不必单独跟踪全局。

于 2013-07-07T14:43:50.100 回答