7

なぜこれがうまくいかないのだろうと思っていましたか?私はプログラミングにかなり慣れていないので、Python を学んでいます。

def convert(x,y):
    while True:
        try:
            global x
            x = int(input("Number: "))
        except ValueError:
            print("Make sure it is a number.")
    while True:
        try:
            global y
            y = int(input("Number: "))
        except ValueError:
            print("Make sure it is a number.")


convert(x,y)

これを機能させる方法を教えてください。

また、これを実行したときに表示されるエラーは、name 'x' is parameter and global.

わかりました、私はそれを修正しました。これは正しいコードです。

def convert():
    while True:
        try:
            global number
            number = int(input("Number: "))
            break
        except ValueError:
            print("Make sure it is a number.")
    while True:
        try:
            global number2
            number2 = int(input("Number: "))
            break
        except ValueError:
            print("Make sure it is a number.")


convert()
4

5 に答える 5

7

Python では、関数へのパラメーター (定義の横にある括弧内のもの) は、コード内の関数のスコープにローカル変数として追加されます。Python インタープリターは、コードの主要なスキャンをいくつか行います。1 つ目は構文スキャンで、プログラムが Python の規則に従って構文的に正しいかどうかをテストします。これらのルールの 1 つは、独自のスコープを持つ特定のコード ブロックの場合、ローカル名前空間とグローバル名前空間の両方にある変数を持つことはできないということです。

このスキャンでは、コードを実行する前に、いくつかの特別なチェックを行います。すべてのグローバル変数とローカル変数の名前を保存し、それらを相互にチェックします。関数へのパラメータは関数のスコープ内で「ローカル」と見なされなければならないため、矛盾が生じるため、関数定義内で「グローバル」として宣言することはできません。

あなたができることは、関数定義の前に宣言xyてグローバルにすることであり、それは機能します。

于 2013-09-15T00:42:10.213 に答える
4

Haidro は問題をよく説明しています。ここに解決策があります。

ユーザーから 2 つの値を読み取り、それらを x と y に保存したいようです。そのために、関数から複数の値を返すことができます (python はこれをサポートしています)。

例:

def convert():
    x = 0
    y = 0
    while True:
        try:
            x = int(input("Number: "))
            break
        except ValueError:
            print("Make sure it is a number.")
    while True:
        try:
            y = int(input("Number: "))
            break
        except ValueError:
            print("Make sure it is a number.")

    return x, y # magic 

a, b = convert() # you could name these any way you want, even x/y, no collisions anymore

もちろん、重複したものを削除するためにコードを少しクリーンアップすることをお勧めします。

def readNumber():
    while True:
        try:
             x = int(input("Number: "))
             return x
        except ValueError:
             print("Make sure it is a number!")

# and then
a = readNumber()
b = readNumber()

# or:
def convert():
    return readNumber(), readNumber()
a, b = convert()
于 2013-09-15T00:40:20.380 に答える
3

パラメータをオーバーライドしようとしているが、xできないためです。関連する質問はこちら

これを修正するには、変数にそのような名前を付けないでください。あなたのコードはほとんどです:

x = 'hi'
x = 5
print(x)
# Why isn't this 'hi'?

ちなみに、while ループは無期限に実行されます。の後x = int(input("Number: "))に、break. もう一方のループも同様です。

于 2013-09-15T00:32:23.230 に答える