Python的烦人持久性错误:初学者

时间:2012-10-28 15:53:45

标签: python

我刚开始学习python并不断收到一个我无法弄清楚的错误。任何帮助都将受到大力赞赏。基本上,我不断收到以下错误:

Enter an int: 8

Traceback (most recent call last):
  File "C:\Users\Samuel\Documents\Python Stuff\Find Prime Factors of Number.py", line 16, in <module>
    once_cycle()
  File "C:\Users\Samuel\Documents\Python Stuff\Find Prime Factors of Number.py", line 8, in once_cycle
    while x==0:
UnboundLocalError: local variable 'x' referenced before assignment

我看到很多人都有同样的问题,但当我看到人们告诉他们要做的事情时,我无法理解。无论如何,我的代码是这样的。我已经重新检查了所有缩进,并且看不出它的问题。这个程序的目的是找到一个int的主要因素(虽然它只有90%完成)。它是用Python 2.7.3编写的。

import math
testedInt = float(raw_input("Enter an int: "))
workingInt = testedInt
x = 0

def once_cycle():
    for dividor in range(1, int(math.floor(math.sqrt(testedInt))+1)):
        while x==0:
            print "Called"
            if (workingInt%dividor == 0):
                workingInt = workingInt/dividor
                x = 1
    if (workingInt > 1):
        once_cycle()
    return

once_cycle()

print workingInt

提前感谢您的帮助,

萨姆

4 个答案:

答案 0 :(得分:6)

one_cycle()功能中,您分配<{1}}

x

这使 if (workingInt%dividor == 0): workingInt = workingInt/dividor x = 1 成为局部变量。你也指的是测试:

x

但在将分配给之前。这是您例外的原因。

在函数的开头添加 while x==0: ,或者将其声明为全局(如果这就是你的意思)。根据它的外观,你不要在函数之外使用x = 0,所以你可能并不认为它是。

以下作品; x也正在修改,因此需要声明workingInt

global

或简化:

def once_cycle():
    global workingInt
    x = 0

    for dividor in range(1, int(math.floor(math.sqrt(testedInt))+1)):
        while x==0:
            print "Called"
            if (workingInt%dividor == 0):
                workingInt = workingInt/dividor
                x = 1
    if (workingInt > 1):
        once_cycle()
    return

def once_cycle(): global workingInt for dividor in range(1, int(math.sqrt(testedInt)) + 1): while True: if workingInt % dividor == 0: workingInt = workingInt / dividor break if workingInt > 1: once_cycle() 已经取代了浮点论证。

请注意,如果int(floating_point_number) 不是 workingInt % dividor,您最终会遇到无限循环。第一次0是一个奇数,例如,这会打击你,你的循环永远不会退出。

testedInt为例;您将尝试除数1112。虽然3是除数,但1将保持workingInt并且循环中断。下一个11循环,除数为for2永远不会给你workingInt % 2,因此循环将永远持续。

答案 1 :(得分:2)

您需要在x中声明全局变量testedIntworkingIntone_cycle()才能在那里访问它们:

def once_cycle():
    global x
    global testedInt
    global workingInt

答案 2 :(得分:1)

来自

x
x = 0

中的

不同

while x==0:

有关如何在函数内使用全局变量的信息,请参阅Using global variables in a function other than the one that created them

答案 3 :(得分:1)

您需要在globals的代码中定义3 once_cycle()

由于函数中的变量是静态定义的,而不是在调用函数时定义的。因此python认为变量testedIntworkingIntx被函数视为本地变量并且它会引发错误。

import math
testedInt = float(raw_input("Enter an int: "))
workingInt = testedInt
x = 0

def once_cycle():
    global x
    global workingInt
    global testedInt
    for dividor in range(1, int(math.floor(math.sqrt(testedInt))+1)):
        while x==0:
            print "Called"
            if (workingInt%dividor == 0):
                workingInt = workingInt/dividor
                x = 1
                if (workingInt > 1):
                    once_cycle()
                return
once_cycle()