分配的变量获取“ UnboundLocalError”

时间:2019-01-03 20:27:26

标签: python variables local

UnboundLocalError:分配前引用了局部变量'i'。 那是我从代码中得到的错误,但是我的“ i”仍然在本地范围内。

功能因子2(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:'是for循环的一部分,它不应引发错误

s = factors2(81)
print(s)

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

我的脚本应该起作用,并给我两个数字

  

更新:谢谢,我想通了。这是我factor2()中的一个错误,当n = 0、1和2时,它无法运行。

1 个答案:

答案 0 :(得分:1)

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

例如,由count产生的第一个值是1。然后是tri_num(1) == 1,因此factors2n == 1调用。这导致对range(2, int(1**.5)+1)的调用,从而导致range(2,2)的确为空。由于迭代器从不产生值,因此从未分配i并输入else子句,在此假设i 确实具有值。 QED。