Débutant Python => Passage de paramètre - Python - Programmation
Marsh Posté le 01-10-2007 à 19:14:10
par adresse.
dans ton exemple1, tu ecrase l'adresse de ton 'ancien' x.
l'effet est surtout visible sur les paramètres par défaut :
Code :
|
la sortie devrait être
Code :
|
Marsh Posté le 01-10-2007 à 19:35:53
zapan666 a écrit : par adresse. |
Ok. Et il y a moyen de modifier le contenu de ce "x" et non son adresse (si on imagine que la valeur est calculée par la fonction et donc qu'on ne peut pas la passer lors de l'appel à toto) ???
Python c'est extra mais quand on vient du C on aime bien savoir ce qu'il se passe au fond des choses...
Marsh Posté le 01-10-2007 à 21:33:08
Python est comme java, il fonctionne par "passage de références par valeur".
Une "variable" comme "x" n'est en fait qu'un label, un pointeur vers une référence Python.
Donc "x = 5" donne simplement le label "x" à la référence vers l'objet de valeur "5"
zapan666 a écrit : par adresse.
|
non et non, et ça sort 5 et 3.
Ce dont tu parles, c'est le fait que le paramètre par défaut est construit une fois pour toute (quand la fonction est générée), donc quand çe paramètre est mutable ça fait des effets bizarres, les gens découvrent habituellement ça en utilisant des listes, quand ils modifient l'objet référencé:
Code :
|
Sve@r a écrit : Ok. Et il y a moyen de modifier le contenu de ce "x" et non son adresse (si on imagine que la valeur est calculée par la fonction et donc qu'on ne peut pas la passer lors de l'appel à toto) ??? |
x n'est pas un conteneur, c'est un label vers une référence.
Ca ne correspond ni a un pointeur C ni a une référence C++ (surtout pas même)
Marsh Posté le 01-10-2007 à 22:59:44
masklinn a écrit :
|
Excellent exemple très démonstratif.
Si je ne me trompe pas, il montre l'existence d'une variable spécifique au paramètre par défaut et s'il n'y a pas de paramètre, c'est cette variable qui est utilisée (d'où le fait qu'on retrouve les nombres déjà générés quand on appelle bar() sans paramètre même si on a appelé bar() avec des paramètres entre temps)
masklinn a écrit : |
Ok donc on peut pas. Bon, c'est pas grave et de toute façon je suis certain que si un jour j'ai besoin que ma fonction modifie une variable, je pourrai me débrouiller autrement. C'était juste pour savoir.
Merci
PS: Mercredi, jeudi et vendredi je suis en stage Python intensif chez Bull (Massy Palaiseau). Je vais m'éclater
Marsh Posté le 02-10-2007 à 08:01:36
Sve@r a écrit : |
Pas variable
Objet
Objet spécifique par défaut instancié au moment de la création (de l'instanciation) de la fonction, même
Sinon, oui.
Marsh Posté le 02-10-2007 à 09:21:52
ReplyMarsh Posté le 03-10-2007 à 11:04:58
masklinn a écrit : |
J'ai développé cet exemple et créé une méthode avec paramètre par défaut identique à la fonction bar()
Code :
|
Ainsi, on peut s'apercevoir que cet objet instancié lors de l'appel de la méthode "bar" est commun à tous les objets "cTest" créés...
Marsh Posté le 03-10-2007 à 11:07:00
Ben oui, puisque la fonction "bar" est instanciée en même temps que la classe "cTest". Si c'était pas le cas, les gros objets un peu lourdingues seraient inutilisables (parce que leur instanciation signifieraient créer et initialiser toutes leurs méthodes et propriétés... un peu violent)
Marsh Posté le 01-10-2007 à 18:22:48
Salut à tous, je débute en Python et je me pose certaines questions à propos du passage de paramètres à une fonction. Par adresse ou par valeur ???
Exemple 1
Exemple 2
Donc il semble que si on passe à une fonction un truc simple (style un int) le passage se fait par valeur, si on lui passe un truc complexe (un tableau, un objet) le passage se fait par adresse et la fonction peut modifier le truc reçu. Me trompe-je ???
Question subsidiaire => il y a moyen dans l'exemple 1 de faire en sorte que toto() modifie le paramètre reçu ???
Merci à tous
---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.