python变量的最佳位置

python变量的最佳位置,python,Python,我有一些代码具有这种一般结构: def runSolver(): global a global b while (condition) : # do some stuff recalculateIntermediateParameters() # do more stuff return result def recalculateIntermediateParameters(): # read glob

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

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()
我想知道这是否是最好的实现。例如,在函数中声明globals是一种不好的做法吗?我知道在Java中,最好在任何函数定义之外声明全局变量

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

但是如果函数只读取
a
b
,而不进行操作,该怎么办?这会影响全球安置吗?此外,如果
a
b
是冗长的列表怎么办?从性能角度来看,将值从一个函数传递到另一个函数有意义吗?哪种模式在“pythonic”代码和性能之间提供了最佳折衷?

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

例如,函数也是全局函数<代码>重新计算中间参数未分配给,仅被引用,并且您不需要使用全局重新计算中间参数即可执行此操作

Python使用不同的操作码来分配局部变量和全局变量。如果您这样做:

def foo():
    a = 10

def foo():
    global a
    a = 10
Python使用两种不同的操作将
a
更新为本地或全局

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

在函数中更改标识符时,只需将其声明为全局标识符。如果只引用
a
b
而不分配给它们,则可以省略
global
语句

例如,函数也是全局函数<代码>重新计算中间参数未分配给,仅被引用,并且您不需要使用全局重新计算中间参数即可执行此操作

Python使用不同的操作码来分配局部变量和全局变量。如果您这样做:

def foo():
    a = 10

def foo():
    global a
    a = 10
Python使用两种不同的操作将
a
更新为本地或全局


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

ah。谢谢你的澄清。但这并没有回答更紧迫的问题,即通过还是全球声明。@franklin:我补充了一个简短的解释,说明了为什么你希望避免总体上的全球状态。在这个阶段还有什么不清楚的吗?@Martijin我真的认为在我研究计算机科学的时候,状态的概念让我难以捉摸。从我对图灵机器计算的理解来看,程序的状态或m.-config描述了当前机器“关注”的过程。从我对程序状态或机器配置的简要阅读中,我猜可以将其描述为该程序的regsiter存储的所有不同值的当前聚合,它将准确地描述机器的整个
状态
,该视图正确吗?此外,您是否建议此时删除
globals
,以便在函数之间传递这些值?因为@eyquem声明它们实际上是引用,所以我假设性能时间不会明显地受到这种范式的影响?在这种情况下,不断变化的全局变量可以被视为状态。将其与静态的、常量的全局比较,例如类定义或函数。啊。谢谢你的澄清。但这并没有回答更紧迫的问题,即通过还是全球声明。@franklin:我补充了一个简短的解释,说明了为什么你希望避免总体上的全球状态。在这个阶段还有什么不清楚的吗?@Martijin我真的认为在我研究计算机科学的时候,状态的概念让我难以捉摸。从我对图灵机器计算的理解来看,程序的状态或m.-config描述了当前机器“关注”的过程。从我对程序状态或机器配置的简要阅读中,我猜可以将其描述为该程序的regsiter存储的所有不同值的当前聚合,它将准确地描述机器的整个
状态
,该视图正确吗?此外,您是否建议此时删除
globals
,以便在函数之间传递这些值?因为@eyquem声明它们实际上是引用,所以我假设性能时间不会明显地受到这种范式的影响?在这种情况下,不断变化的全局变量可以被视为状态。将其与静态的、常量的全局函数(如类定义或函数)进行比较。我发现您的问题过于笼统,无法回答。我认为没有绝对的范例。
global
的使用取决于每种情况下的目标。顺便说一句,我的建议是避免在Python中使用variable这个词,因为只有对象、指向对象的底层指针和标识符(直接链接到引擎盖下的指针,并在算法和脚本级别间接分配给对象)。variable是一个模棱两可的词,在其他语言中,它的意思不是Python中的标识符和对象,而是Python中可管理的实体。@eyquem适当地指出了thanksTo be clea