Écrivez quelques lignes de code Python,, X
qui ne référencent aucune variable globale, telles que
def method():
X
print(a)
method()
imprime 1
mais
def method():
X
X
print(a)
method()
impressions 2
.
Donc, je déteste être pointilleux, mais il semble que vars
et locals
sont en fait des 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()
En outre, il semble que les gens aimeraient voir des critères de victoire objectifs pour des puzzles comme celui-ci. La longueur du code ne se sent pas vraiment ici, alors peut-être pourrions-nous créer un système de points brownie pour diverses nouvelles fonctionnalités du code? Je ne sais pas exactement ce que cela pourrait être, mais voici un début:
- +1 pour vraiment vraiment pas de globaux (non
vars
oulocals
) - +1 pour avoir été le premier à publier une technique particulière
- +1 pour la solution la plus courte publiée
- +1 pour une solution n'impliquant qu'une seule instruction Python
- +1 pour des "hacks" intéressants comme rejoindre des non-frontières lexicales
- +1 pour ne pas utiliser d'exceptions
Et si vous pouvez penser à plus, vous pouvez modifier cette question pour l'ajouter à la liste.
Ce problème peut-il être résolu sans utiliser d'exceptions et sans utiliser des globaux comme vars
et locals
? Je soupçonne que c'est possible, même si je n'ai pas encore compris exactement comment ...
X
, mais il existe d'autres options.Réponses:
Initialise la variable
a
à0
seulement si elle est pas déjà initialisé dans le tableau des variables. Ensuite, l'incrémente.Plus brièvement (merci à l'histocrate pour
len
):Si les deux copies de
X
pouvaient être sur la même ligne, nous pourrions fairequi double à
avec "l'agneau sacrificiel"
aa
dévorant la deuxième affectation variable.la source
a=len(vars())+1
Python
La pensée de cette solution, car
try
etexcept
a été la première façon dont je pensais de déterminer si une variable existe encore ou non.la source
Python 2
Fondamentalement, lorsqu'il
exec
est rencontré dans Python 2, il provoque la0x01
suppression d' un indicateur spécial ( )method.func_code.co_flags
, ce qui fait que leslocals
affectations ont un effet. J'ai exploité cela pour implémenter lenonlocal
support en Python 2 (voir la ligne 43 pour le xor qui modifie le drapeau).la source
a = locals().get('a', 0) + 1
?exec''
;)Ma première idée (puis la faire naître) a été:
Mais la réponse de l'histocrate semble optimale.
la source
Ma tentative. Utilise le module mathématique pour suivre si X est exécuté une ou deux fois.
la source
Modifié en réponse au commentaire: a est une liste de listes vides de longueur n, où n est le nombre de fois que vous avez appelé la méthode. L'appel de cette méthode imprime deux fois 1 puis 2.
la source
a=[]
en paramètre est en dehors des paramètres de ce défi.Le
try
bloc vérifie si la variable a est définie.Si la variable n'est pas définie (c'est uniquement lorsque le bloc X est présent une fois), une
NameError
exception est déclenchée.Si une variable est définie, (c'est lorsque le bloc X est présent deux fois), alors
else
sera entré.la source
else