Bienvenue sur IndexError.

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

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

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,608 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,674 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 ?

...