[Python] Variables a assimiler
Résolu
nidhogg-59
Messages postés
102
Date d'inscription
Statut
Membre
Dernière intervention
-
nidhogg-59 Messages postés 102 Date d'inscription Statut Membre Dernière intervention -
nidhogg-59 Messages postés 102 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je souhaite assimiler la valeur d'une variable déjà définie dans mon script à une variable entrée par l'utilisateur. Ce n'est pas vraiment clair, donc :
a=3
b=input("") #ici, l'utilisateur entre la lettre "a".
Je voudrais assimiler à "b" la valeur de ma variable "a" et non pas la lettre "a".
Donc la variable "b" serait égale à 3...
J'ai cherché partout, j'ai rien trouvé.
Je vous remercie de vos futur réponses =)
A voir également:
- [Python] Variables a assimiler
- Citizen code python avis - Accueil - Outils
- Mot secret python pix ✓ - Forum Python
- Python est introuvable. exúcutez sans argument pour procúder ó l ✓ - Forum Python
- Le fichier contient un programme écrit en python. le programme construit un mot secret mais il ne l'affiche pas. modifiez ce programme afin que à chaque itération de la boucle : la variable a augmente de 2 la variable b diminue de 1 ajoutez une instruction pour faire afficher le mot secret construit. quel est ce mot secret ? ✓ - Forum Python
- Python par la pratique : 101 exercices corrigés pdf - Forum Python
4 réponses
Salut
La fonction globals() renvoie un dictionnaire qui exprime l'espace de noms global.
Ce dictionnaire a pour valeur les chaînes de caractères utilisées comme identifiant au niveau global dans le code.
Il a des valeurs qui sont les objets correspondant aux identifiants.
une exécution du code ci-dessus:
Au sein d'un bloc (fonction, ou classe), la fonction locals() renvoie un dictionnaire qui exprime l'espace de noms local à ce bloc.
Attention, car locals() dans une fonction référence les identifiants libres = ceux utilisés dans la fonction mais définis à l'extérieur de la fonction,
mais locals() ne référence pas les identifiants libres au sein des méthodes d'une classe (qui sont à peu près des fonctions mais pas tout à fait).
Cf pages essentielles à lire:
https://docs.python.org/3/reference/executionmodel.html#naming-and-binding
https://docs.python.org/3/tutorial/classes.html#python-scopes-and-namespaces
La fonction globals() renvoie un dictionnaire qui exprime l'espace de noms global.
Ce dictionnaire a pour valeur les chaînes de caractères utilisées comme identifiant au niveau global dans le code.
Il a des valeurs qui sont les objets correspondant aux identifiants.
a = 3 e = 10 vv = 'ululu' print 'a==%s id(a)==%d type(a)==%s' % (a,id(a),type(a)) print 'e==%s id(e)==%d type(e)==%s' % (e,id(e),type(e)) print 'vv==%s id(vv)==%d type(vv)==%s' % (vv,id(vv),type(vv)) print while True: x = raw_input('Entrer une chaîne (aucun caractère, pour arrêter) : ') print 'x==%s id(x)==%d type(x)==%s' % (x,id(x),type(x)) if x in globals(): b = globals()[x] print 'b==%s id(b)==%d type(b)==%s\n' % (b,id(b),type(b)) else: if not x: break print "Aucun identifiant '%s' n'est recensé dans ce code\n" % x
une exécution du code ci-dessus:
a==3 id(a)==10021744 type(a)==<type 'int'> e==10 id(e)==10021660 type(e)==<type 'int'> vv==ululu id(vv)==18603840 type(vv)==<type 'str'> Entrer une chaîne (aucun caractère, pour arrêter) : a x==a id(x)==10702288 type(x)==<type 'str'> b==3 id(b)==10021744 type(b)==<type 'int'> Entrer une chaîne (aucun caractère, pour arrêter) : vv x==vv id(x)==18566992 type(x)==<type 'str'> b==ululu id(b)==18603840 type(b)==<type 'str'> Entrer une chaîne (aucun caractère, pour arrêter) : GGG x==GGG id(x)==18566968 type(x)==<type 'str'> Aucun identifiant 'GGG' n'est recensé dans ce code Entrer une chaîne (aucun caractère, pour arrêter) : a x==a id(x)==10702288 type(x)==<type 'str'> b==3 id(b)==10021744 type(b)==<type 'int'> Entrer une chaîne (aucun caractère, pour arrêter) : e x==e id(x)==10700752 type(x)==<type 'str'> b==10 id(b)==10021660 type(b)==<type 'int'> Entrer une chaîne (aucun caractère, pour arrêter) : vv x==vv id(x)==18566968 type(x)==<type 'str'> b==ululu id(b)==18603840 type(b)==<type 'str'> Entrer une chaîne (aucun caractère, pour arrêter) : x== id(x)==10699552 type(x)==<type 'str'>
Au sein d'un bloc (fonction, ou classe), la fonction locals() renvoie un dictionnaire qui exprime l'espace de noms local à ce bloc.
Attention, car locals() dans une fonction référence les identifiants libres = ceux utilisés dans la fonction mais définis à l'extérieur de la fonction,
mais locals() ne référence pas les identifiants libres au sein des méthodes d'une classe (qui sont à peu près des fonctions mais pas tout à fait).
Cf pages essentielles à lire:
https://docs.python.org/3/reference/executionmodel.html#naming-and-binding
https://docs.python.org/3/tutorial/classes.html#python-scopes-and-namespaces
En VBS, il y a Exec et Eval, en Python, je sais pas. Ce genre de truc n'est pas souvent possible, mais tu.doit pouvoir te débrouiller avec un tableau de variables.
Salut
En Python, on ne se débrouille pas, on a ce qu'il faut à disposition: les fonctions locals() et globals() sont toutes prêtes à fournir les dictionnaires adéquats à ce genre de problèmes.
Encore faut il avoir compris un peu les espaces de noms et connaître l'existence de la table des symboles ( https://docs.python.org/3/library/symtable.html ), les pythonistes me semblent loin d'être tous dans ce cas hélas
En Python, on ne se débrouille pas, on a ce qu'il faut à disposition: les fonctions locals() et globals() sont toutes prêtes à fournir les dictionnaires adéquats à ce genre de problèmes.
Encore faut il avoir compris un peu les espaces de noms et connaître l'existence de la table des symboles ( https://docs.python.org/3/library/symtable.html ), les pythonistes me semblent loin d'être tous dans ce cas hélas
Utilise la fonction exec
Cette fonction est évidemment DANGEREUSE.
Exemple:
Attention en Python 3 , la fonction raw_input est remplacée par input
Cette fonction est évidemment DANGEREUSE.
Exemple:
johand@osiris: ~/src/CCM/python $ cat exec_test.py # -*- coding: utf-8 -*- a="Ma valeur" varname = raw_input("Une chaine: ")[0:1] command = varname + " = a" print(command) exec(command) print(varname + " vaut \"" + eval(varname) + "\"") johand@osiris: ~/src/CCM/python $ python exec_test.py Une chaine: bcde b = a b vaut "Ma valeur"</gras>
Attention en Python 3 , la fonction raw_input est remplacée par input
salut
Comme tu ajoutes " = a" , la valeur de la chaîne nommée commande se termine toujours par " = a" et donc exec(command) fait toujours prendre à l'objet de nom varname la valeur de l'objet de nom a
Ce que veut niddhog, c'est justement de pouvoir spécifier qu'il faudrait ajouter " = v" quand il entre la lettre v, ajouter " = juju" quand il entre la chaîne juju, etc.
D'autre part, je ne comprends pas la motivation de [0:1]
Comme tu ajoutes " = a" , la valeur de la chaîne nommée commande se termine toujours par " = a" et donc exec(command) fait toujours prendre à l'objet de nom varname la valeur de l'objet de nom a
Ce que veut niddhog, c'est justement de pouvoir spécifier qu'il faudrait ajouter " = v" quand il entre la lettre v, ajouter " = juju" quand il entre la chaîne juju, etc.
D'autre part, je ne comprends pas la motivation de [0:1]
Tu n'as pas compris le problème.
Dit autrement, ton code donne toujours le même résultat, quel que soit ce qui est entré comme chaîne:
j''ai ajouté une instruction z = "Autre" dans ton code
et voici ce qu'on obtient quand on entre la chaîne 'z' lors d'une exécution:
niddhog voudrait obtenir "Autre" dans ce cas.
Dit autrement, ton code donne toujours le même résultat, quel que soit ce qui est entré comme chaîne:
j''ai ajouté une instruction z = "Autre" dans ton code
a="Ma valeur" z = "Autre" varname = raw_input("Une chaine: ") command = varname + " = a" print(command) exec(command) print(varname + " vaut \"" + eval(varname) + "\"")
et voici ce qu'on obtient quand on entre la chaîne 'z' lors d'une exécution:
Une chaine: z z = a z vaut "Ma valeur"
niddhog voudrait obtenir "Autre" dans ce cas.