Valor predeterminado en una función en Python

Estoy notando lo siguiente:

class c: def __init__(self, data=[]): self._data=data a=c() b=c() a._data.append(1) print b._data [1] 

¿Es este el comportamiento correcto?

Sí, es el comportamiento correcto.

Sin embargo, de su pregunta, parece que no es lo que esperaba.

Si desea que coincida con sus expectativas, tenga en cuenta lo siguiente:

Regla 1. No utilice objetos mutables como valores predeterminados.

 def anyFunction( arg=[] ): 

No creará un objeto de lista nueva. El objeto de lista predeterminado para arg se compartirá en todo el lugar.

similar

 def anyFunction( arg={} ): 

no creará un nuevo objeto dict. Este dictado predeterminado será compartido.

 class MyClass( object ): def __init__( self, arg= None ): self.myList= [] if arg is None else arg 

Esa es una forma común de proporcionar un valor de argumento predeterminado que es un objeto de lista nueva y vacía.

Este es un escollo clásico. Consulte http://zephyrfalcon.org/labs/python_pitfalls.html , sección 5: “Argumentos predeterminados mutables”

Siempre haga funciones como esta entonces:

 def __init__ ( self, data = None ): if data is None: data = [] self._data = data 

Alternativamente, también puede usar data = data or [] , pero eso evita que el usuario pase parámetros vacíos ( '' , 0 , False , etc.).