¿Los parámetros se pasan por valor o por referencia en Python?

En C / C ++, paso por valor y paso por referencia son dos formas de pasar parámetros de función. ¿Cómo se pasan los parámetros en Python? Antes de responder a esta pregunta, es mejor mirar dos fragmentos de código.

Fragmento de código 1:

def foo(arg):
    arg = 2
    print(arg)

a = 1
foo(a)  # 输出:2
print(a) # 输出:1

Los estudiantes que leen el Código 1 pueden decir que los parámetros se pasan por valor.

Fragmento de código 2:

def bar(args):
    args.append(1)

b = []
print(b)# 输出:[]
print(id(b)) # 输出:4324106952
bar(b)
print(b) # 输出:[1]
print(id(b))  # 输出:4324106952

Después de leer el fragmento de código 2, algunas personas pueden decir que el parámetro se pasa por referencia. Entonces surge la pregunta: ¿El parámetro se pasa por valor o por referencia o ninguna de las dos? Para aclarar este problema, primero comprenda la relación entre variables y objetos en Python.

Variables y objetos

Todo en Python es un objeto, los números son objetos, las listas son objetos, las funciones son objetos y todo es un objeto. La variable es una referencia (también llamada nombre o etiqueta) de un objeto, y las operaciones del objeto se realizan todas por referencia. Por ejemplo, [] es un objeto de lista vacío y la variable a es una referencia a ese objeto

a = []
a.append(1)

En Python, "variable" se llama con más precisión "nombre", y la operación de asignación = es vincular un nombre a un objeto. Es como agregar una etiqueta a un objeto.

a = 1

Inserte la descripción de la imagen aquí

Asignar el entero 1 a la variable a es equivalente a vincular una etiqueta a al entero 1.

a = 2

Inserte la descripción de la imagen aquí
Asignar el entero 2 a la variable a equivale a arrancar la etiqueta a del entero 1 original y pegarla en el entero 2.

b = a

Inserte la descripción de la imagen aquí
Asignar la variable a a otra variable b es equivalente a adjuntar dos etiquetas ayb al objeto 2. El objeto 2 puede operarse a través de estas dos variables.

La variable en sí no tiene información de tipo, la información de tipo se almacena en el objeto, que es muy diferente de la variable en C / C ++ (una variable en C es un área de memoria)

Parámetros de función

En las funciones de Python, el paso de parámetros es esencialmente una operación de asignación, y la operación de asignación es un proceso de vinculación de nombres a objetos. Después de comprender la naturaleza de la asignación y el paso de parámetros, analicemos los dos fragmentos de código anteriores.

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def foo(arg):
    arg = 2
    print(arg)

a = 1
foo(a)  # 输出:2
print(a) # 输出:1

Inserte la descripción de la imagen aquí
En el segmento de código 1, la variable a está vinculada a 1. Cuando se llama a la función foo (a), es equivalente a asignar arg = 1 al parámetro arg. En este momento, ambas variables están vinculadas a 1. Después de reasignar arg a 2 en la función, es equivalente a quitar la etiqueta arg en 1 y pegarla al cuerpo de 2, mientras que siempre existe otra etiqueta a en 1. Por lo tanto, print (a) sigue siendo 1.

Mira el fragmento de código 2 nuevamente

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def bar(args):
    args.append(1)

b = []
print(b)# 输出:[]
print(id(b)) # 输出:4324106952
bar(b)
print(b) # 输出:[1]
print(id(b))  # 输出:4324106952

Inserte la descripción de la imagen aquí
Antes de que se ejecute el método append, tanto b como arg apuntan a (enlazar) el mismo objeto. Cuando se ejecuta el método append, no hay operación de reasignación y no hay un nuevo proceso de vinculación. El método append simplemente inserta un elemento en el objeto de lista, y el objeto sigue siendo ese Objeto, pero el contenido dentro del objeto ha cambiado. Debido a que b y arg están vinculados al mismo objeto, la ejecución del método b.append o arg.append opera esencialmente en el mismo objeto, por lo que el contenido de b ha cambiado después de que se llama a la función (pero el id no ha cambiado) , Sigue siendo el objeto original)

Finalmente, volviendo a la pregunta en sí, ¿es por valor o por referencia? No es exacto decir que pasar por valor o pasar por referencia. Si hay un nombre exacto, se llama llamada por objeto. Si usted es un entrevistador, debe verificar si el candidato está familiarizado con el paso de parámetros de la función Python. En lugar de discutir el significado literal, es mejor obtener algo de código real.
muéstrame el código

def bad_append(new_item, a_list=[]):
    a_list.append(new_item)
    return a_list

Este código es el error más común para los principiantes, que utilizan objetos mutables como valores predeterminados de los parámetros. Una vez definida la función, el parámetro predeterminado a_list apuntará (vinculará) a un objeto de lista vacío. Cada vez que se llama a la función, se agrega el mismo objeto. Por lo tanto, escribir de esta manera tendrá errores potenciales y el mismo método de llamada arrojará resultados diferentes.

>>> print bad_append('one')
['one']
>>> print bad_append('one')
['one', 'one']

Inserte la descripción de la imagen aquí
La forma correcta es especificar el valor predeterminado del parámetro como Ninguno

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def good_append(new_item, a_list=None):
    if a_list is None:
        a_list = []
    a_list.append(new_item)
    return a_list

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/sinat_38682860/article/details/109311375
Recomendado
Clasificación