【问题标题】:"UnboundLocalError: local variable" but variable is a global [closed]“UnboundLocalError:局部变量”但变量是全局[关闭]
【发布时间】:2012-09-25 18:49:40
【问题描述】:

我按照Python Queue 页面底部的队列示例进行操作。我想访问工作函数中的一些全局变量,但是,有些全局变量是可访问的,有些则不是。在下面的简单示例中,可以访问“行”和“错误”变量,但随后我得到 UnboundLocalError 进行计数。如果我输入“全局计数”,那么它就可以了。但我不明白为什么其他全局变量可以访问。

File "myfile.py", line 184, in dpn_worker
    count += 1
UnboundLocalError: local variable 'count' referenced before assignment

这是我使用的代码示例:

dpns = [1,2,3,4]
q = Queue.Queue()
rows = []
errors = []
count = 0

def dpn_worker():
    while True:
        item = q.get()
        rows.append(1)
        errors.append(1)
        count += 1
        q.task_done()

def main():
    for d in dpns:
        q.put(d)

    for i in range(NUM_WORKERS):
        t = threading.Thread(target=dpn_worker)
        t.daemon = True
        t.start()

    q.join()

【问题讨论】:

  • 将问题标题粘贴到搜索框中会给出stackoverflow.com/q/9264763/395760 作为第一个结果。一点点研究真的那么难吗? -1
  • 对不起,我一开始确实搜索过。猜猜我的 google-fu 这次让我失望了。

标签: python scope global-variables


【解决方案1】:

在这种情况下,由于 count 是一个整数: -

count += 1

等价于

count = count + 1

所以,您正在尝试修改全局变量,但实际上是在创建一个局部变量。但是在 RHS 上,您在初始化之前使用的是局部变量..

将您的 dpn_worker 修改为:-

def dpn_worker():
    global count
    while True:
        item = q.get()
        rows.append(1)
        errors.append(1)
        count += 1
        q.task_done()

【讨论】:

  • 不,它并不完全等价。就地添加可以具有,并且在某些集合的情况下,具有与“常规”添加不同的语义。
  • @delnan.. 好的.. 它是否在某处定义,在什么条件下它们不同?实际上我几天前就开始用 Python 编码了..
  • @RohitJain 一个例子可以是列表,因为列表+= 用作extend()lis =lis +somelis 实际上创建了一个新列表(lis+somelis),然后将其分配给lis LHS。
  • @RohitJain 可能,但它可能有其他名称,仍然包含原始列表。如果你做了a = [1, 2],那么b = a,然后a = a + [3]a将是[1, 2, 3],而b将是[1, 2]。如果您使用a += [3],则两者都是[1, 2, 3]
  • @AshwiniChaudhary .. 是的,你是对的.. 有很多东西要学 SO.. 谢谢 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-30
  • 2019-07-24
  • 2017-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多