it-swarm.com.de

name "Zeiten" wird vor der globalen Deklaration verwendet - aber IT IS erklärt!

Ich programmiere ein kleines Programm für die Zeit und zeige auf geordnete Weise die Lösungen meiner Rubik-Würfel. Aber Python (3) macht mir immer wieder Sorgen, dass Zeiten vor der globalen Deklaration verwendet werden. Aber was seltsam ist, dass IT IS gleich am Anfang als times = [] deklariert wurde (ja, es ist eine Liste) und dann noch einmal als times = [some, weird, list] über die Funktion (über die er sich beschwert) und sie mit "globalisiert" global times. Hier ist mein Code, damit Sie ihn nach Belieben analysieren können:

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

Jede Hilfe wäre sehr dankbar, da ich neu in der Welt von Python bin :)

25
AntonioPT

Die globale Deklaration ist, wenn Sie deklarieren, dass timesglobal ist.

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

Wenn eine Variable als global deklariert ist, kann sie nicht vor der Deklaration verwendet werden.

In diesem Fall brauchen Sie die Deklaration meines Erachtens überhaupt nicht, da Sie times nicht zuweisen, sondern nur ändern.

31
John Millikin

Aus der Python-Dokumentation:

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

Das Verschieben von global times an den Anfang der Funktion sollte also in Ordnung sein.

Sie sollten jedoch versuchen, in dieser Situation keine Globals zu verwenden. Erwägen Sie die Verwendung einer Klasse.

20
carl

Aus den Python Docs

In einer globalen Anweisung aufgeführte Namen dürfen nicht in demselben Codeblock verwendet werden, der der globalen Anweisung textuell vorausgeht.

3
randlet

Dieses Programm sollte funktionieren, funktioniert aber möglicherweise nicht genau so, wie Sie es beabsichtigt haben. Bitte beachten Sie die Änderungen.

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

Für das Hauptprogramm können Sie es oben deklarieren. Es erfolgt keine Warnung. Aber wie gesagt, die globale Erwähnung ist hier nicht sinnvoll. Jede Variable im Hauptprogramm befindet sich im globalen Raum. In Funktionen müssen Sie mit diesem Schlüsselwort deklarieren, dass Sie den globalen Speicherplatz dafür verwenden möchten.

0
Mih Zam