136 votes

Passage d'un entier par référence en Python

Comment puis-je passer un entier par référence en Python ?

Je veux modifier la valeur d'une variable que je passe à la fonction. J'ai lu que tout en Python est transmis par valeur, mais il doit y avoir un truc facile. Par exemple, en Java, vous pouvez passer les types de référence de Integer , Long etc.

  1. Comment puis-je passer un entier dans une fonction par référence ?
  2. Quelles sont les meilleures pratiques ?

6voto

mheyman Points 795

Le vieux truc du type vide est peut-être un peu plus autodocumenté que le truc de la liste de longueur 1 :

def inc_i(v):
    v.i += 1

x = type('', (), {})()
x.i = 7
inc_i(x)
print(x.i)

6voto

Tal Points 789

A tableau numpy à un élément est mutable et pourtant, dans la plupart des cas, il peut être évalué comme s'il s'agissait d'une variable numérique python. Par conséquent, c'est un conteneur de nombres par référence plus pratique qu'une liste à un seul élément.

    import numpy as np
    def triple_var_by_ref(x):
        x[0]=x[0]*3
    a=np.array([2])
    triple_var_by_ref(a)
    print(a+1)

sortie :

7

6voto

Chris Pugmire Points 41

La bonne réponse est d'utiliser une classe et de placer la valeur à l'intérieur de la classe, ce qui vous permet de passer par référence exactement comme vous le souhaitez.

class Thing:
  def __init__(self,a):
    self.a = a
def dosomething(ref)
  ref.a += 1

t = Thing(3)
dosomething(t)
print("T is now",t.a)

3voto

newacct Points 42530

En Python, chaque valeur est une référence (un pointeur vers un objet), tout comme les non-primitives en Java. De plus, comme Java, Python ne permet que le passage par valeur. Ainsi, d'un point de vue sémantique, ils sont à peu près les mêmes.

Puisque vous mentionnez Java dans votre question, j'aimerais voir comment vous réalisez ce que vous voulez en Java. Si vous pouvez le montrer en Java, je peux vous montrer comment le faire de manière exactement équivalente en Python.

3voto

shruti Points 57
class PassByReference:
    def Change(self, var):
        self.a = var
        print(self.a)
s=PassByReference()
s.Change(5)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X