我正在编写一个小程序,用于计时并以有序的方式显示我的魔方解决方案。但是 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 世界的新手。
全局声明是当你声明
times
是global
时
def timeit():
global times # <- global declaration
# ...
如果声明了变量
global
,则在声明之前不能使用该变量。
在这种情况下,我认为你根本不需要声明,因为你没有分配给
times
,只是修改它。
来自Python文档:
全局语句中列出的名称不得在同一代码块中使用 文本位于该全局声明之前。
https://docs.python.org/reference/simple_stmts.html#global
因此将
global times
移动到函数顶部应该可以修复它。
但是,在这种情况下你应该尽量不要使用
global
。考虑使用类。
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]”必须从定义开始;)
来自 Python 文档
全局语句中列出的名称不得在该全局语句之前的同一代码块中使用。
该程序应该可以运行,但可能无法完全按照您的预期运行。请注意更改。
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()
对于主程序,可以在顶部声明。不会有任何警告。但是,如前所述,全局提及在这里没有用。主程序中放置的每个变量都位于全局空间中。在函数中,您必须使用 this 关键字声明您想要使用全局空间。
我在下面遇到了同样的错误:
语法错误:名称“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
我只是记录一些读书笔记,如有错误,欢迎指正。
感谢@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