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%しか完了していません)。Python2.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場合は、無限ループになることに注意してください。初回は奇数です。たとえば、これはあなたを襲うでしょう、そしてあなたのループは決して終了しません。 0testedInt

たとえば11、除数、、、を試して12ます3。は1除数ですが、workingInt残り11、ループが中断します。次forのループ、除数は2であり、workingInt % 2決してあなたに与えることはない0ので、ループは永遠に続きます。

于 2012-10-28T15:56:15.673 に答える
2

グローバル変数にアクセスするにはx、グローバル変数testedIntを宣言する必要があります。workingIntone_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 に答える