Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

modifier une variable par reference

+5 votes

Je sais que la façon normale de créer ou modifier une variable en python est de lui assigner une valeur.

Les dev C/C++ semblent heureux d'avoir à leur disposition la possibilité de passer par pointeur / référence.

Est-ce possible, et est il parfois utile de faire de même en python.

demandé 13-Jun-2015 par buffalo974 (2,952 points)

1 Réponse

+8 votes
 
Meilleure réponse

C'est déjà le cas, quand tu passe un parametre a une fonction tu passes toujours le parametre par référence et non par valeur.

mais
- la référence est passée par valeur.
- certains objets sont mutables ou immutables (voir cette question IndexError)

Il y a un excellent exemple sur cette réponse SO.

En résumé,

Tu pourras modifier la valeur d'un objet mutable (l'exemple avec une liste)

In [1]: def alter(a):
   ...:     a.append(1)
   ...:     

In [2]: alist = [1,2]

In [3]: id(alist)
Out[3]: 139977890209448

In [4]: alist
Out[4]: [1, 2]

In [5]: alter(alist)

In [6]: alist
Out[6]: [1, 2, 1]

In [7]: id(alist)
Out[7]: 139977890209448

Tu ne peux pas écraser la référence d'un objet passée en parametre car celle ci est passée par valeur

In [23]: def alter(a):
    a = []
   ....:     

In [24]: alist = [1,2]

In [25]: id(alist)
Out[25]: 139977855259280

In [26]: alter(alist)

In [27]: alist
Out[27]: [1, 2]

In [28]: id(alist)
Out[28]: 139977855259280

Tu ne peux de toute facon pas modifier la valeur d'un immutable

In [29]: astring="a"

In [30]: id(astring)
Out[30]: 139977979057536

In [31]: astring += "b"

In [32]: id(astring)
Out[32]: 139977893705448

Et comme tu ne peux pas écraser sa référence :

In [33]: def alter(a):
   ....:     a+="B"
   ....:  

In [36]: astring = "A"

In [37]: alter(astring)

In [38]: astring
Out[38]: 'A'
répondu 13-Jun-2015 par jc (2,704 points)
sélectionné 15-Jun-2015 par buffalo974

pythontutor.com est super pour se représenter ce qui se passe dans un programme en terme de référence.
Voici ce que donne le 1er exemple de jc ici.

+1 @bubulle, pas mal le lien !

peux t on créer une espèce de pointeur comme en C ?

Avec ctypes, oui , mais uniquement pour les objets que tu manipules via ctypes (qui viendraient donc de .dll, .so ou .dylib)

que se passe t il si dans mon code python j'essaie de passer en force en modifiant la valeur contenue dans une adresse mémoire ?

...