为什么在Python中交互的两个全局字典会抛出一个本地引用错误?
当我使用两个全局字典(在我的例子中是计数器)进行交互时,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
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
放在任何地方,不要依赖于编译器并假设它能理解。