python - nonlocal - el nombre ''tiempos'' se usa antes de la declaración global, ¡pero SE HA DECIDIDO!
variable local python (5)
De la documentación de 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
Por lo tanto, mover global times
a la parte superior de la función debería estar bien.
Pero, deberías tratar de no usar globales en esta situación. Considera usar una clase.
Estoy programando un pequeño programa para mostrar el tiempo y mostrar, de manera ordenada, mis soluciones de cubo de Rubik. Pero Python (3) me sigue molestando sobre los tiempos que se usan antes de la declaración global. Pero lo extraño es que se declara, justo al principio, como times = []
(sí, es una lista) y luego nuevamente, en la función (ahí es donde se queja) como times = [some, weird, list]
y "globalizarlo" con global times
. Aquí está mi código, por lo que puedes analizarlo como quieras:
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()
Cualquier ayuda sería muy apreciada ya que soy nuevo en el mundo de Python :)
De los documentos de Python
Los nombres enumerados en una declaración global no se deben usar en el mismo bloque de código que precede textualmente a esa declaración global.
Este programa debería funcionar, pero puede no funcionar exactamente como lo desea. Por favor, tome nota de los cambios.
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()
La declaración global es cuando declaras que los times
son global
def timeit():
global times # <- global declaration
# ...
Si una variable se declara global
, no se puede usar antes de la declaración.
En este caso, no creo que necesites la declaración en absoluto, porque no estás asignando times
, simplemente modificándolos.
Para el programa principal, puede declararlo en la parte superior. No habrá advertencia. Pero, como dije, la mención global no es útil aquí. Cada variable puesta en el programa principal está en el espacio global. En las funciones, debe declarar que desea utilizar el espacio global para ello con esta palabra clave.