web-dev-qa-db-ja.com

名前「回」はグローバル宣言の前に使用されます-しかし、IT IS宣言されました!

私は小さなプログラムをコーディングして、ルービックキューブの解法を順序正しく表示します。しかし、Python(3)は、グローバル宣言の前に使用される時間について私を悩ませ続けます。しかし、奇妙なのは、IT ISが宣言され、 times = [](はい、それはリストです)そして、もう一度、関数(彼が文句を言うところです)としてtimes = [some, weird, list]としてglobal timesで「グローバル化」します。これが私のコードです。あなたが望むようにそれを分析するかもしれません:

import time

times = []

def timeit():
    input("Press ENTER to start: ")
    start_time = time.time()
    input("Press ENTER to stop: ")
    end_time = time.time()
    the_time = round(end_time - start_time, 2)
    print(str(the_time))
    times.append(the_time)
    global times
    main()

def main():
    print ("Do you want to...")
    print ("1. Time your solving")
    print ("2. See your solvings")
    dothis = input(":: ")
    if dothis == "1":
        timeit()
    Elif dothis == "2":
        sorte_times = times.sort()
        sorted_times = sorte_times.reverse()
        for curr_time in sorted_times:
            print("%d - %f" % ((sorted_times.index(curr_time)+1), curr_time))
    else:
        print ("WTF? Please enter a valid number...")
        main()

main()

私はPython :)の世界で新しいので、どんな助けでも非常にありがたいです

32
AntonioPT

グローバル宣言は、timesglobalであることを宣言するときです

def timeit():
    global times # <- global declaration
    # ...

変数がglobalとして宣言されている場合、宣言の前に使用することはできません。

この場合、timesに割り当てず、変更するだけなので、宣言はまったく必要ないと思います。

33
John Millikin

Pythonドキュメントから:

Names listed in a global statement must not be used in the same code block
textually preceding that global statement.

http://docs.python.org/reference/simple_stmts.html#global

だから、global times関数の先頭に移動する必要があります。

ただし、この状況ではグローバルを使用しないようにする必要があります。クラスの使用を検討してください。

21
carl

Python Docs から

グローバルステートメントにリストされている名前は、そのグローバルステートメントの前にある同じコードブロックでは使用できません。

3
randlet

このプログラムは機能するはずですが、意図したとおりに機能しない可能性があります。変更点に注意してください。

import time

times = []

def timeit():
    input("Press ENTER to start: ")
    start_time = time.time()
    input("Press ENTER to stop: ")
    end_time = time.time()
    the_time = round(end_time - start_time, 2)
    print(str(the_time))
    times.append(the_time)

def main():
    while True:
        print ("Do you want to...")
        print ("1. Time your solving")
        print ("2. See your solvings")
        dothis = input(":: ")
        if dothis == "1":
            timeit()
        Elif dothis == "2":
            sorted_times = sorted(times)
            sorted_times.reverse()
            for curr_time in sorted_times:
                print("%d - %f" % ((sorted_times.index(curr_time)+1), curr_time))
            break
        else:
            print ("WTF? Please enter a valid number...")

main()
1
Noctis Skytower

メインプログラムの場合は、上部で宣言できます。警告はありません。しかし、言われたように、グローバルな言及はここでは役に立ちません。メインプログラムに置かれた各変数は、グローバル空間にあります。関数では、このキーワードを使用してグローバルスペースを使用することを宣言する必要があります。

0
Mih Zam