¿Python llama por referencia o llama por valor?

Python utiliza un sistema, que se conoce como «Llamada por referencia de objeto» o «Llamada por asignación». En el caso de que pase argumentos como números enteros, strings o tuplas a una función, el paso es como una llamada por valor porque no puede cambiar el valor de los objetos inmutables que se pasan a la función. Mientras que pasar objetos mutables se puede considerar como una llamada por referencia porque cuando sus valores se cambian dentro de la función, también se reflejarán fuera de la función.
Ejemplo 1: 
 

Python3

# Python code to demonstrate
# call by value
 
 
string = "Geeks"
 
 
def test(string):
     
    string = "GeeksforGeeks"
    print("Inside Function:", string)
     
# Driver's code
test(string)
print("Outside Function:", string)

Producción 
 

Inside Function: GeeksforGeeks
Outside Function: Geeks

Ejemplo 2 
 

Python3

# Python code to demonstrate
# call by reference
 
 
def add_more(list):
    list.append(50)
    print("Inside Function", list)
 
# Driver's code
mylist = [10,20,30,40]
 
add_more(mylist)
print("Outside Function:", mylist)

Producción 
 

Inside Function [10, 20, 30, 40, 50]
Outside Function: [10, 20, 30, 40, 50]

Vinculación de nombres a objetos

En python, cada variable a la que asignamos un valor/contenedor se trata como un objeto. Cuando estamos asignando un valor a una variable, en realidad estamos vinculando un nombre a un objeto .
 

Python3

a = "first"
b = "first"
 
 
# Returns the actual location
# where the variable is stored
print(id(a))
 
# Returns the actual location
# where the variable is stored
print(id(b))
 
# Returns true if both the variables
# are stored in same location
print(a is b)

Producción 
 

110001234557894
110001234557894
True

Ahora, tratemos de entender esto mejor con otro ejemplo.
Ejemplo 2:
 

Python3

a = [10, 20, 30]
b = [10, 20, 30]
 
# return the location
# where the variable
# is stored
print(id(a))
 
# return the location
# where the variable
# is stored
print(id(b))
 
# returns false if the
# location is not same
print(a is b)

Producción 
 

541190289536222
541190288737777
False

El resultado de los dos ejemplos anteriores es diferente porque la lista es mutable y la string es inmutable . Una variable inmutable no se puede cambiar una vez creada. Si deseamos cambiar una variable inmutable , como una string, debemos crear una nueva instancia y vincular la variable a la nueva instancia. Mientras que la variable mutable se puede cambiar en su lugar.
Ejemplo 3: 
 

Python3

def foo(a):
     
    # A new variable is assigned
    # for the new string
    a = "new value"
    print("Inside Function:", a)
     
     
# Driver's code
string = "old value"
foo(string)
 
print("Outside Function:", string)

Producción:
 

Inside Function: new value
Outside Function: old value

En el ejemplo anterior, una string que es un tipo de objeto inmutable se pasa como argumento a la función foo. Dentro del alcance de la función foo dada, a= “nuevo valor” se ha acotado al mismo objeto que la string se ha atado fuera. Dentro del alcance de la función foo, modificamos «valor antiguo» por «valor nuevo». Una vez que dejamos el alcance de la función foo, a=”nuevo valor” ya no está en el espacio de nombres, y el valor al que se refiere la string nunca se cambió.
Ejemplo 4: ahora, veamos cómo se pasa la variable mutable a la función.
 

Python3

def foo(a):
    a[0] = "Nothing"
     
# Driver' code
bar = ['Hi', 'how', 'are', 'you', 'doing']
foo(bar)
print(bar)

Producción: 
 

['Nothing, 'how', 'are', 'you', 'doing']

Cuando pasamos una variable mutable a la función foo y la modificamos con algún otro nombre, la función foo todavía apunta a ese objeto y continúa apuntando a ese objeto durante su ejecución. 
 

Publicación traducida automáticamente

Artículo escrito por priyanshid1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *