web-dev-qa-db-fra.com

nom 'times' est utilisé avant la déclaration globale - Mais IT IS déclaré!

Je suis en train de coder un petit programme pour chronométrer et montrer, de manière ordonnée, les solutions de mon cube Rubik. Mais Python (3) continue de me préoccuper des temps utilisés avant la déclaration globale. Mais ce qui est étrange, c’est que IT IS a déclaré, dès le début, le times = [] (oui, c’est une liste) et encore une fois, sur la fonction (c’est là où il se plaint) comme times = [some, weird, list] et le "globaliser" avec global times. Voici mon code, vous pouvez donc l’analyser comme vous le souhaitez:

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()

Toute aide serait très appréciée car je suis nouvelle dans le monde de Python :)

25
AntonioPT

La déclaration globale est lorsque vous déclarez que times est global

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

Si une variable est déclarée global, elle ne peut pas être utilisée avant la déclaration.

Dans ce cas, je ne pense pas que vous ayez besoin de la déclaration, car vous n'affectez pas à times, vous la modifiez.

31
John Millikin

De la documentation 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

Donc, déplacer global times en haut de la fonction devrait suffire.

Mais, vous devriez essayer de ne pas utiliser les globals dans cette situation. Pensez à utiliser une classe.

20
carl

Depuis le Python Docs

Les noms répertoriés dans une instruction globale ne doivent pas être utilisés dans le même bloc de code précédant textuellement cette instruction globale.

3
randlet

Ce programme devrait fonctionner mais pourrait ne pas fonctionner exactement comme vous le souhaitiez. Veuillez prendre note des modifications.

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

Pour le programme principal, vous pouvez le déclarer en haut. Il n'y aura pas d'avertissement. Mais, comme dit, la mention globale n’est pas utile ici. Chaque variable insérée dans le programme principal est dans l’espace global. Dans les fonctions, vous devez déclarer que vous souhaitez utiliser l'espace global avec ce mot clé.

0
Mih Zam