0

我刚刚开始学习 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

4 回答 4

6

在您的one_cycle()功能中,您有时会分配给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是奇数,例如,这会打到你,你的循环永远不会退出。

11为例;您将尝试除数1,23. While1是一个除数,workingInt将保留11并且循环中断。下一个for循环,除数是2,并且workingInt % 2永远不会给你0,所以循环将永远继续。

于 2012-10-28T15:56:15.673 回答
2

您需要声明全局变量xtestedIntworkingInt在内部声明one_cycle()以便在那里访问它们:

def once_cycle():
    global x
    global testedInt
    global workingInt
于 2012-10-28T15:57:29.387 回答
1

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

由于函数中的变量是静态定义的,而不是在调用函数时。所以python认为变量testedInt,workingIntx被函数认为是局部变量,它会引发错误。

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()
于 2012-10-28T15:59:57.200 回答
1

x从_

x = 0

与来自的不一样

while x==0:

有关如何在函数中使用全局变量的信息,请参阅在创建它们的函数之外的函数中使用全局变量。

于 2012-10-28T15:56:45.860 回答