Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在Python中交互的两个全局字典会抛出一个本地引用错误?_Python_Python 3.x_Dictionary_Counter - Fatal编程技术网

为什么在Python中交互的两个全局字典会抛出一个本地引用错误?

为什么在Python中交互的两个全局字典会抛出一个本地引用错误?,python,python-3.x,dictionary,counter,Python,Python 3.x,Dictionary,Counter,当我使用两个全局字典(在我的例子中是计数器)进行交互时,Python会抛出一个本地引用错误。为了说明这个问题,下面是示例代码: from collections import Counter hourly_detections = Counter() daily_detections = Counter() def populate_hourly(): hourly_detections['cat'] += 1 hourly_detections['dog'] += 2

当我使用两个全局字典(在我的例子中是计数器)进行交互时,Python会抛出一个本地引用错误。为了说明这个问题,下面是示例代码:

from collections import Counter

hourly_detections = Counter()
daily_detections = Counter()

def populate_hourly():
    hourly_detections['cat'] += 1
    hourly_detections['dog'] += 2
    hourly_detections['mouse'] += 3

def populate_daily():
    daily_detections += hourly_detections

def run():
    populate_hourly()
    populate_daily()

    print(hourly_detections)
    print(daily_detections)

if __name__ == '__main__':
    run()
此代码在populate_daily函数中引发以下错误:UnboundLocalError:赋值前引用的局部变量“daily_detections”

但是,如果我们在populate_daily函数中添加专门用于每日_检测的全局标志,那么代码将完美地运行:

from collections import Counter

hourly_detections = Counter()
daily_detections = Counter()

def populate_hourly():
    hourly_detections['cat'] += 1
    hourly_detections['dog'] += 2
    hourly_detections['mouse'] += 3

def populate_daily():
    global daily_detections
    daily_detections += hourly_detections

def run():
    populate_hourly()
    populate_daily()

    print(hourly_detections)
    print(daily_detections)

if __name__ == '__main__':
    run()
输出为:

计数器({'mouse':3,'dog':2,'cat':1})

计数器({'mouse':3,'dog':2,'cat':1})


有人能解释这种行为以及如何最好地避免它吗?

不要忘记在每个功能中使用
全局每日检测
全局每小时检测

Python认为这些是局部变量,除非您在函数开始时将它们声明为全局变量,然后在尝试进行
hourly_检测['cat']+=1
之后,您基本上是在尝试将一个变量添加到“未初始化的变量”中


如果您希望将其作为功能参数发送,因为这被认为是更好的做法(请阅读)。

不要忘记在每个功能中使用
全局每日检测
全局每小时检测

Python认为这些是局部变量,除非您在函数开始时将它们声明为全局变量,然后在尝试进行
hourly_检测['cat']+=1
之后,您基本上是在尝试将一个变量添加到“未初始化的变量”中


如果您希望将它们作为函数参数发送,因为这被认为是更好的做法(请阅读)。

在我接受之前,您能帮助我理解为什么我在populate\u hourly函数中没有得到相同的错误吗?我没有在那里提到全球。它只发生在populate_daily中。我在前面(最后)添加了一个解释,说明在函数中使用全局变量是不好的,因为它会导致很多混乱和误解。如果不使用
全局变量\u name
它不知道该怎么想:它是全局变量还是局部变量?在这种情况下,它设法理解(可能与
[“word”]
有关)
每小时的检测是全局性的,但不在每日检测中。无论如何,这是一种非常糟糕的做法,您应该将其作为参数传递,或者将其作为
全局
放在任何地方,而不要依赖编译器并假设它会理解。在我接受之前,您能否帮助我理解为什么在populate\u函数中没有得到相同的错误?我没有在那里提到全球。它只发生在populate_daily中。我在前面(最后)添加了一个解释,说明在函数中使用全局变量是不好的,因为它会导致很多混乱和误解。如果不使用
全局变量\u name
它不知道该怎么想:它是全局变量还是局部变量?在这种情况下,它设法理解(可能与
[“word”]
有关)
每小时的检测是全局性的,但不在每日检测中。无论如何,这是一种非常糟糕的做法,你要么把它作为参数传递,要么把
global
放在任何地方,不要依赖于编译器并假设它能理解。