Soit le programme
Pour le premier programme, les varaiables ne sont pas permutées, pour le 2ème ca fonctionneCode:
1
2
3
4
5
6 def permut(a,b): a,b=b,a def permut2(a,b): a,b=b,a return a,b
Pourriez vous me dire pourquoi?
Version imprimable
Soit le programme
Pour le premier programme, les varaiables ne sont pas permutées, pour le 2ème ca fonctionneCode:
1
2
3
4
5
6 def permut(a,b): a,b=b,a def permut2(a,b): a,b=b,a return a,b
Pourriez vous me dire pourquoi?
Bonjour,
le passage de paramètre par référence ne s'applique que sur les variables dites mutables:
Variables non mutables (immutable): int, float, str, tuple, ...
Variables mutables: list, dict, set, valeurs d'instance d'une classe, ...
>>> var1 = 1Code:
1
2 def permut(a, b): a, b = b, a
>>> var2 = 2
>>> permut(var1, var2)
>>> var1
1
>>> var2
2
Sauf qu'on ne peut pas échanger les objects, seulement leur contenu, dans le cas d'une liste il faut transférer son contenu par méthode de slicing.
Code:
1
2 def permut(a, b): # pour une seule valeur a[0], b[0] = b[0], a[0]
>>> var1 = [1,]Code:
1
2 def permut(a, b): # pour tout le tableau a[:], b[:] = b[:], a[:]
>>> var2 = [2,]
>>> permut(var1, var2)
>>> var1
[2]
>>> var2
[1]
Pour pouvoir permuter les variables mutables il suffit de retourner une tuple inversée et l'appliquer sur cette même tuple.
Code:
1
2 def permut(a, b): return b, a
>>> var1 = 1
>>> var2 = 2
>>> var1, var2 = permut(var1, var2)
>>> var1
2
>>> var2
1
La fonction permut va retourner une tuple (2, 1) qui va réaffecter les valeurs var1, var2
comme ceci: a, b, c = 1, 2, 3
var1, var2 = permut(var1, var2) équivaut à écrire a, b = b, a. Il est possible de modifier les valeurs retournées dans la fonction, exemple: return b*2, a*4
Voici un guide complet sur le sujet et les différentes méthodes: How do I write a function with output parameters (call by reference)?
Salut,
La permutation a bien lieu dans la première fonction aussi mais elle ne sert pas à grand chose puisqu'elle ne retourne rien.
Plus clairement:
La fonction permut() fait son travail mais cela n'a aucun effet sur a et b de l'espace de nom global.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 >>> a, b = 7, 'e' >>> def permut(a, b): ... a, b = b, a ... print('a: %s, b: %s' %(a, b)) ... >>> def permut_and_return(a, b): ... a, b = b, a ... return a, b ... >>> a, b = permut_and_return(a, b) >>> print('a: %s, b: %s' %(a, b)) a: e, b: 7 >>> # on recommence ... a, b = 7, 'e' >>> permut(a, b) a: e, b: 7 >>> print('a: %s, b: %s' %(a, b)) a: 7, b: e >>>
Dans la fonction permut() a et b n'existe que dans son espace de nom et ne sont pas les mêmes que les a et b de départ.
Salut,
La deuxième fonction "marche" à condition d'assigner les objets retournés aux mêmes variables globales:
Mais si vous aviez écrit:Code:
1
2 a, b = 0, 1 a, b = permuter(a, b)
les objets assignés à a, b ne changent pas.Code:
1
2 a, b = 0, 1 u, v = permuter(a, b)
C'est une conséquence de ce que Python appelle espaces "locals" et "globals" et du comportement d'une fonction.
Et si cela ne vous paraît pas logique, s'en accommoder fait partie de l'apprentissage d'un langage.
- W