name 'times' 在全局声明之前被使用 - 但确实已声明

46 投票
8 回答
100626 浏览
提问于 2025-04-15 18:17

我正在编写一个小程序,用来记录和展示我的魔方解法时间,并且按顺序排列。但是,Python(3)总是提醒我在全局声明之前使用了变量“times”。奇怪的是,我确实在一开始就声明了它,写成了 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的世界里还是个新手。

8 个回答

2

来自 Python文档

在一个全局声明中列出的名字,不能在同一个代码块中出现在这个全局声明之前。

35

来自Python文档的内容:

在全局声明中列出的名称,不能在那个全局声明之前的同一代码块中使用。

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

所以,把 global times 移到函数的最上面应该能解决这个问题。

不过,你应该尽量避免在这种情况下使用 global。可以考虑使用一个类。

49

全局声明就是你告诉程序,times这个变量是全局的。

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

如果一个变量被声明为global,那么在声明之前是不能使用这个变量的。

在这种情况下,我觉得你根本不需要这个声明,因为你并不是在给times赋值,只是在修改它。

撰写回答