имя 'times' используется до глобального объявления - но оно объявлено! - PullRequest
27 голосов
/ 21 января 2010

Я время от времени кодирую небольшую программу и показываю упорядоченным образом решения моего кубика Рубика. Но Python (3) продолжает беспокоить меня по поводу времен использования до глобального объявления. Но что странно, это то, что ЭТО объявлено, с самого начала, как 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:)

Ответы [ 5 ]

32 голосов
/ 21 января 2010

Глобальное объявление - это когда вы заявляете, что times равно global

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

Если объявлена ​​переменная global, ее нельзя использовать до объявления.

В этом случае я не думаю, что вам вообще нужно объявление, потому что вы не присваиваете times, просто модифицируете его.

20 голосов
/ 21 января 2010

Из документации 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 в начало функции должно быть в порядке.

Но вы должны стараться не использовать глобалы в этой ситуации. Рассмотрите возможность использования класса.

3 голосов
/ 21 января 2010

Из Python Docs

Имена, перечисленные в глобальном операторе, не должны использоваться в том же блоке кода, текстуально предшествующем этому глобальному оператору.

1 голос
/ 21 января 2010

Эта программа должна работать, но может работать не так, как вы предполагали. Пожалуйста, примите к сведению изменения.

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()
0 голосов
/ 29 сентября 2016

Для основной программы вы можете объявить ее сверху. Там не будет никаких предупреждений. Но, как сказано, глобальное упоминание здесь бесполезно. Каждая переменная, помещенная в основную программу, находится в глобальном пространстве. В функциях вы должны объявить, что хотите использовать для этого глобальное пространство с этим ключевым словом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...