分配的变量得到 'UnboundLocalError'

assigned variable gets 'UnboundLocalError'

UnboundLocalError:赋值前引用了局部变量 'i'。 这是我从代码中得到的错误,但我的 'i' 仍在本地范围内。

函数 factor2(n) 本身起作用。但是当放入 for 循环时,它会抛出错误。我知道这背后有什么东西,但我想不通。

def tri_num(n):
    return n * (n + 1) // 2


def factors2(n):
    f_ = 1
    for i in range(2, int(n ** .5) + 1):
        count_ = 0
        while n % i == 0:
            count_ += 1
            n /= i
        if count_ != 0:
            f_ *= count_ + 1
    else:
        if n > i:
            f_ *= 2
    return f_


import itertools
for n in itertools.count(1):
    m = tri_num(n)
    q= factors2(m)
    if q > 500:
        print(m,q)
        break


*

---------------------------------------------------------------------------
    UnboundLocalError                         Traceback (most recent call last)
    <ipython-input-52-07bebaa60ddd> in <module>()
          2 for n in itertools.count(1):
          3     m = tri_num(n)
    ----> 4     q= factors2(m)
          5     if q > 500:
          6         print(m,q)

    <ipython-input-51-214ce9ab60ad> in factors2(n)
          9             f_ *= count_ + 1
         10     else:
    ---> 11         if n > i:
         12             f_ *= 2
         13     return f_

    UnboundLocalError: local variable 'i' referenced before assignment

*

'else:' is part of the for loop, it should not throw an error

s = factors2(81)
print(s)

给我我的答案“5”,没有错误。

我的脚本应该可以运行并给我两个数字

UPDATE: Thank you, I figured out. It is a bug in my factors2(), it fail to function when n = 0, 1 and 2. it will be fixed

您正在遍历一个空范围,这意味着在您进入 for 循环的 else 子句之前从未分配给 i

例如,count 产生的第一个值是 1。然后是 tri_num(1) == 1,因此 factors2 被调用为 n == 1。这导致调用 range(2, int(1**.5)+1),这导致 range(2,2) 确实是空的。由于迭代器永远不会产生值,因此永远不会分配给 i,并且输入 else 子句,您假设 i does 有一个价值。 QED.