Escriba algunas líneas de código Python Xque no hagan referencia a ninguna variable global, de modo que
def method():
X
print(a)
method()
imprime 1pero
def method():
X
X
print(a)
method()
impresiones 2.
Por lo tanto, me gusta ser muy estricto, pero parece varsy localsen realidad son variables globales en Python:
def test_global_1():
global vars, locals
vars = lambda: 2
locals = lambda: 3
def test_global_2():
print(vars())
print(locals())
test_global_1()
test_global_2()
Además, parece que a la gente le gustaría ver criterios objetivos de ganar para acertijos como este. La longitud del código realmente no se siente bien aquí, entonces ¿tal vez podríamos hacer un sistema de puntos brownie para varias características nuevas del código? No estoy seguro de cuáles podrían ser exactamente, pero aquí hay un comienzo:
- +1 para realmente no hay globals (no
varsolocals) - +1 por ser el primero en publicar una técnica en particular
- +1 para la solución más corta publicada
- +1 para una solución que involucra solo una declaración de Python
- +1 para "hacks" interesantes como unirse a no-límites léxicos
- +1 por no usar excepciones
Y si puede pensar en más, puede editar esta pregunta para agregarla a la lista.
¿Se puede resolver este problema sin usar excepciones y sin usar globales como varsy locals? Sospecho que puede, aunque aún no he descubierto exactamente cómo ...

X, pero hay otras opciones.Respuestas:
Inicializa la variable
aque0sólo si no está ya inicializado en la tabla de variables. Luego, lo incrementa.Más brevemente (gracias a histocrat por
len):Si las dos copias de
Xpudieran estar en la misma línea, podríamos hacerque se duplica a
con el "cordero sacrificial"
aacomiendo la segunda asignación variable.fuente
a=len(vars())+1Pitón
El pensamiento de esta solución, puesto
tryyexceptfue la primera forma en que pensaba de determinar si todavía existía o no una variable.fuente
Python 2
Básicamente, cuando
execse encuentra en Python 2, hace0x01que se elimine un indicador especial ( )method.func_code.co_flags, lo que hace que laslocalsasignaciones tengan un efecto. Exploté esto para implementar elnonlocalsoporte en Python 2 (ver la línea 43 para el xor que modifica la bandera).fuente
a = locals().get('a', 0) + 1?exec''más;)Mi primera idea (y luego suavizarla) fue:
Pero la respuesta del histocrat parece óptima.
fuente
Mi intento. Utiliza el módulo matemático para rastrear si X se ejecuta una o dos veces.
fuente
Editado en respuesta al comentario: a es una lista de listas vacías de longitud n, donde n es el número de veces que ha llamado al método. Llamar a este método dos veces imprime 1 y luego 2.
fuente
a=[]como parámetro está fuera de los parámetros para este desafío.El
trybloque verifica si la variable a está definida.Si la variable no está definida (esto es solo cuando el bloque X está presente una vez), entonces se
NameErrorgenera la Excepción.Si se define la variable (esto es cuando el bloque X está presente dos veces)
else, se ingresará.fuente
else