名称“times”在全局声明之前使用 - 但它已声明

问题描述 投票:0回答:8

我正在编写一个小程序,用于计时并以有序的方式显示我的魔方解决方案。但是 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 世界的新手。

python python-3.x global-variables declare variable-declaration
8个回答
48
投票

全局声明是当你声明

times
global

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

如果声明了变量

global
,则在声明之前不能使用该变量。

在这种情况下,我认为你根本不需要声明,因为你没有分配给

times
,只是修改它。


33
投票

来自Python文档:

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

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

因此将

global times
移动到函数顶部应该可以修复它。

但是,在这种情况下你应该尽量不要使用

global
。考虑使用类。


4
投票
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()

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


3
投票

来自 Python 文档

全局语句中列出的名称不得在该全局语句之前的同一代码块中使用。


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

0
投票

对于主程序,可以在顶部声明。不会有任何警告。但是,如前所述,全局提及在这里没有用。主程序中放置的每个变量都位于全局空间中。在函数中,您必须使用 this 关键字声明您想要使用全局空间。


0
投票

我在下面遇到了同样的错误:

语法错误:名称“x”在全局声明之前使用

当尝试在inner()中使用局部变量和全局变量

x
时,如下所示:

x = 0
def outer():
    x = 5
    def inner():        
        x = 10 # Local variable
        x += 1
        print(x)
        
        global x # Global variable
        x += 1
        print(x)
    inner()
outer()

并且,当尝试在inner()中使用非局部和全局变量

x
时,如下所示:

x = 0
def outer():
    x = 5
    def inner():
        nonlocal x # Non-local variable
        x += 1
        print(x)
        
        global x # Global variable
        x += 1
        print(x)
    inner()
outer()

因此,我将局部变量的

x
重命名为
y
,如下所示:

x = 0
def outer():
    x = 5
    def inner():        
        y = 10 # Here
        y += 1 # Here
        print(y) # Here
        
        global x        
        x += 1
        print(x)
    inner()
outer()

然后,错误解决如下:

11
1

并且,我将非局部变量的

x
重命名为
y
,如下所示:

x = 0
def outer():
    y = 5 # Here
    def inner():
        nonlocal y # Here
        y += 1 # Here
        print(y) # Here
        
        global x
        x += 1
        print(x)
    inner()
outer()

然后,错误解决如下:

6
1

0
投票

我只是记录一些读书笔记,如有错误,欢迎指正。

感谢@Super Kai - Kazuya Ito 提供的示例。这让我想起了Python中的

全局变量是在任何函数外部或全局范围内声明的变量。

因此,如果要定义全局变量,则无需使用

global x
在函数外声明,只需执行
x=1 # Global variable
即可。

需要在函数内部使用

global x
才能调用函数外部定义的全局变量,或者更改全局变量。否则,变量
x
在函数内部仍然未定义,除非您按如下方式命名另一个内部变量“x=4”:

x = 1
def outer():
    x = 5   # local variable for outer()
    def inner():        
        y = 10 # Local variable
        y += 1
        print(y)
        
        x = 4   #local variable for inner()
        x += 1
        print(x)
    inner()
outer()
print(x)

给出输出

11
5
1
© www.soinside.com 2019 - 2024. All rights reserved.