Escriba algunas líneas de código Python X
que no hagan referencia a ninguna variable global, de modo que
def method():
X
print(a)
method()
imprime 1
pero
def method():
X
X
print(a)
method()
impresiones 2
.
Por lo tanto, me gusta ser muy estricto, pero parece vars
y locals
en 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
vars
olocals
) - +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 vars
y locals
? Sospecho que puede, aunque aún no he descubierto exactamente cómo ...
X
, pero hay otras opciones.Respuestas:
Inicializa la variable
a
que0
só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
X
pudieran estar en la misma línea, podríamos hacerque se duplica a
con el "cordero sacrificial"
aa
comiendo la segunda asignación variable.fuente
a=len(vars())+1
Pitón
El pensamiento de esta solución, puesto
try
yexcept
fue la primera forma en que pensaba de determinar si todavía existía o no una variable.fuente
Python 2
Básicamente, cuando
exec
se encuentra en Python 2, hace0x01
que se elimine un indicador especial ( )method.func_code.co_flags
, lo que hace que laslocals
asignaciones tengan un efecto. Exploté esto para implementar elnonlocal
soporte 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
try
bloque 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
NameError
genera la Excepción.Si se define la variable (esto es cuando el bloque X está presente dos veces)
else
, se ingresará.fuente
else