2013-04-02 4 views
1

Je passe un seul élément d'une liste à une fonction. Je veux modifier cet élément, et donc la liste elle-mêmePasser un élément de liste comme référence

def ModList(element): 
    element = 'TWO' 

l = list(); 
l.append('one') 
l.append('two') 
l.append('three') 
print l 
ModList(l[1]) 
print l 

Mais cette méthode ne modifie pas la liste. C'est comme si l'élément passait en valeur. La sortie est la suivante:

[ 'un', 'deux', 'trois']

[ 'un', 'deux', 'trois']

Je veux que le deuxième élément de la liste après l'appel de la fonction à 'TWO': ['one', 'TWO', 'trois']

Est-ce que c'est possible?

Nous vous remercions à l'avance

+0

Il n'y a pas de syntaxe pour faire ce que vous demandez, mais il y a beaucoup de façons de modifier une partie d'une liste.Si vous posez une question sur le problème spécifique pour lequel vous l'utilisez, quelqu'un trouvera la solution la plus intuitive et la plus élégante. – alexis

Répondre

3

Python doesn't do pass by reference. Il suffit de le faire explicitement:

l[1] = ModList(l[1]) 

En outre, étant donné que cela ne change un élément, je suggère que ModList est un nom déroutant.

3

Python est un langage de type valeur par passage, vous ne pouvez donc pas modifier la valeur par affectation dans la fonction ModList. Qu'est-ce que vous pourriez faire à la place que RÉUSSITE la liste et l'index dans ModList puis modifier l'élément de cette façon

def ModList(theList, theIndex) : 
    theList[theIndex] = 'TWO' 

ModList(l, 1) 
0

Les explications déjà ici sont corrects. Cependant, puisque j'ai voulu abuser de Python d'une manière similaire, je vais soumettre cette méthode comme une solution de contournement.

L'appel d'un élément spécifique à partir d'une liste renvoie directement une copie de la valeur de cet élément dans la liste. Même la copie d'une sous-liste d'une liste renvoie une nouvelle référence à un tableau contenant des copies des valeurs. Considérez cet exemple:

>>> a = [1, 2, 3, 4] 
>>> b = a[2] 
>>> b 
3 
>>> c = a[2:3] 
>>> c 
[3] 
>>> b=5 
>>> c[0]=6 
>>> a 
[1, 2, 3, 4] 

Ni b, une valeur ne copie ni c, une sous-liste copié à partir a, est en mesure de modifier les valeurs en a. Il n'y a pas de lien, malgré leur origine commune. Toutefois, les tableaux numpy utilisent une allocation de mémoire "raw-er" et permettent de renvoyer des vues de données. Une vue permet de représenter les données d'une manière différente tout en conservant l'association avec les données d'origine. Un exemple de travail est donc

>>> import numpy as np 
>>> a = np.array([1, 2, 3, 4]) 
>>> a 
array([1, 2, 3, 4]) 
>>> b = a[2] 
>>> b 
3 
>>> b=5 
>>> a 
array([1, 2, 3, 4]) 
>>> c = a[2:3] 
>>> c 
array([3]) 
>>> c[0]=6 
>>> a 
array([1, 2, 6, 4]) 
>>> 

Lors de l'extraction d'un seul élément encore des copies en valeur que, en conservant une vue du tableau de l'élément 2 est référencé à l'élément d'origine 2 de a (bien qu'il soit l'élément maintenant 0 de c), et la modification apportée à la valeur de c change également a.

Numpy ndarray s ont de nombreux types différents, y compris un type d'objet générique. Cela signifie que vous pouvez conserver ce comportement "par référence" pour presque tous les types de données, et pas seulement les valeurs numériques.

Questions connexes