Passage d'arguments à une fonction Python

Passage d'arguments à une fonction Python - Python - Programmation

Marsh Posté le 12-06-2005 à 14:20:37    

Bonjour, j'ai un problème, je veux passer une variable en argument d'une fonction Python, la fonction doit modifier cette variable, mais après l'appel de la fonction cette variable reste inchangée.
Voici le code python.  

Code :
  1. from StringStream import *
  2. class StringStream2(StringStream):
  3.    def __lshift__(self, var):
  4.       StringStream.lshift(self, var)
  5.  
  6.    def __rshift__(self, var):
  7.       var = StringStream.rshift(self, var)
  8.       print var


 
Voici l'illustration du problème dans Python  
 

Code :
  1. >>> import StringStream2
  2. >>> x=StringStream2.StringStream2()
  3. >>> x.Set('26')
  4. >>> y=0
  5. >>> x>>y
  6. 26
  7. >>> print y
  8. 0


quand je fais x >> y, la fonction __rshift__ est bien appelée et la variable var s'affiche, mais pourquoi y n'est pas modifié puisque y correspond à l'argument passé donc à var ?
 
Merci.
 
Bouba

Reply

Marsh Posté le 12-06-2005 à 14:20:37   

Reply

Marsh Posté le 12-06-2005 à 16:32:00    

C'est normal, les arguments en Python sont toujours passés par valeur, pas par référence. Les valeurs en question sont des références, mais ces références ne peuvent être changées car elles sont passées par valeur. Pour les types mutables, on peut toutefois modifier la valeur référencée, mais pour les types immutables (comme les entiers ou les strings) c'est impossible. Je crois que c'est la même chose en Java, d'ailleurs.
 
Exemple:

Code :
  1. >>> def f(x): x += 1
  2. ...
  3. >>> a = 2
  4. >>> f(a)
  5. >>> a
  6. 2
  7. >>> def g(x): x[0] += 1
  8. ...
  9. >>> b = [2]
  10. >>> g(b)
  11. >>> b
  12. [3]
  13. >>> c = 2,
  14. >>> g(c)
  15. Traceback (most recent call last):
  16.   File "<interactive input>", line 1, in ?
  17.   File "<interactive input>", line 1, in g
  18. TypeError: object does not support item assignment


Le premier exemple fonctionne mais ne fait pas ce que tu attends, car c'est une copie de la variable locale à la fonction qui est incrémentée. Le deuxième exemple fonctionne car 'list' est un type mutable. Le troisième exemple ne fonctionne pas car 'tuple' est un type immutable...


Message édité par dividee le 12-06-2005 à 16:33:13
Reply

Marsh Posté le 13-06-2005 à 01:28:43    

Merci, en fait j'ai donc été obligé de passer une liste à un élément au lieu d'un entier à ma fonction pour que celà marche, maintenant c'est bon.

Code :
  1. from StringStream import *
  2.    
  3.      class StringStream2(StringStream):
  4.         def __lshift__(self, var):
  5.            StringStream.lshift(self, var)
  6.        
  7.         def __rshift__(self, var):
  8.            var[0] = StringStream.rshift(self, var[0])
  9.            print var


 
Thanks.
 
Bouba

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed