名称'times'在全球申报之前使用 - 但是它被宣布了!

时间:2010-01-20 22:43:56

标签: python python-3.x global-variables

我正在为一个小程序编写时间,并以有序的方式展示我的魔方解决方案。但Python(3)一直困扰着我在全球宣言之前使用的时间。但奇怪的是,IT正在开始时,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世界的新手:)

6 个答案:

答案 0 :(得分:32)

全局声明是指您timesglobal

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

如果变量声明为global,则在声明之前不能使用它。

在这种情况下,我认为您根本不需要声明,因为您没有分配给times,只是修改它。

答案 1 :(得分:20)

来自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移动到函数顶部应该没问题。

但是,你应该尽量不要在这种情况下使用全局变量。考虑使用一个类。

答案 2 :(得分:3)

来自Python Docs

  

全局语句中列出的名称不得在文本上位于该全局语句之前的相同代码块中使用。

答案 3 :(得分:1)

此程序应该可以正常运行,但可能无法完全按照您的意图运行。请注意这些变化。

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

答案 4 :(得分:0)

对于主程序,您可以在顶部声明它。 Ther将不会发出警告。但是,如上所述,全球提及在这里没有用。放入主程序的每个变量都在全局空间中。在函数中,您必须声明要使用此关键字的全局空间。

答案 5 :(得分:0)

import time

times = []

def timeit():
    global times
    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)
    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()

应该可以。 “全局[varname]”必须从定义开始;)