Python方法中的执行顺序

Order of execution in Python methods

本问题已经有最佳答案,请猛点这里访问。

我试过看几个不同的例子,但我不太确定为什么这行不通。假设我有这样的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def loadVariable():
    global count
    count = 0

def loadDictionary():
    location = 'some location'
    global myDict
    myDict = pickle.load(open(location, 'rb'))

def main():
    loadVariable()
    loadDictionary()
    for item in myDict:
        if item.startswith("rt"):
            count += 1
            item = item[3:]

if __name__ == '__main__':
    main()

在我看来,if语句是执行的,它启动了main()方法。然后,加载全局变量,加载字典,执行for循环。

但是,当我运行代码时,我被告知局部变量计数在赋值之前被引用。为什么会这样?

编辑(解释我在评论中写的一些内容):

这不起作用(尽管我认为这是因为全局在这里使用错误):

1
2
3
4
5
6
7
8
global count

def loadVariables()
    count = 0

def main():
    loadVariables()
    rest of code etc

这也不起作用:

1
2
3
4
5
6
7
def loadVariables()
    count = 0

def main():
    global count
    loadVariables()
    rest of code etc

到目前为止,我让它工作的唯一方法是使用上面提供的链接,它将计数视为一个列表,如下所示:

1
2
3
4
5
6
7
8
def loadVariables():
    global count
    count = [0]

def main():
    loadVariables():
    rest of code etc
        count[0] += 1


global表示在包含global声明的函数中,global声明中的名称是全局变量。这并不意味着"这是一个全局变量,在任何地方都要把它当作全局变量。"在main中,countmyDict这两个名称指的是局部变量,因为main没有声明要使用全局变量。


问题是,您没有在main函数中将count声明为全局变量,因此当编译器看到您(最终)要分配给它时,它假定它是局部变量。因为它的值是在分配之前读取的,所以您会得到一个异常。

所以,最基本的解决方法就是在main()的顶部添加global count,但我认为避免全局是更好的选择。为什么loadVariableloadDictionary不返回结果,而不是将它们分配给全局?如果在main()中执行count = loadVariable()操作,那么count将是一个局部变量,在以后尝试重新分配它时不会出现问题。


下面是一个简单的例子,说明global是如何工作的。

1
2
3
4
5
6
7
8
9
10
11
12
13
global_var = 0

def updater():
    global global_var
    global_var += 1


def stuff(x):
    updater()
    return global_var + x

if __name__ == '__main__':
    stuff(2)  # returns 3