我有一些具有这种通用结构的代码:
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
仅读取未被函数操纵,该怎么办?这会影响全球布局吗?此外,如果a
和b
是冗长的列表怎么办?在性能视角中将值从函数传递给函数是否有意义?哪种范例提供了“pythonic”代码和性能之间的最佳折衷?
答案 0 :(得分:6)
只有 需要在函数中更改标识符时声明标识符是全局的。如果您仅引用a
和b
而未分配给它们,则可以省略global
语句。
函数也是全局变量。 recalculateIntermediateParameters
未分配,仅被引用,您无需使用global recalculateIntermediateParameters
即可。
Python使用不同的操作码来分配本地和全局。如果你这样做:
def foo():
a = 10
与
def foo():
global a
a = 10
Python使用两个不同的操作将a
更新为本地或全局。
更一般地说,您希望避免使用全局变量传递 state 。将值作为参数传递(使用基元,或复合结构,如字典或自定义类实例)。它使您的代码更易于阅读和调试,因为您可以通过函数跟踪状态,而不必单独跟踪全局。