Citando Data Model
objetos son la abstracción de Python para los datos. Todos los datos en un programa Python están representados por objetos o por relaciones entre objetos. (En un sentido, y de conformidad con el modelo de una de Von Neumann “ordenador de programa almacenado ,” código está también representada por objetos.)
Desde el punto de vista de Python, Fundamental data type es fundamentalmente diferente de C/C++ . Se utiliza para asignar tipos de datos C/C++
a Python. Y, por el momento, dejemos la discusión y consideremos el hecho de que todos los datos son objeto y son manifestación de alguna clase. Cada objeto tiene una identificación (algo así como dirección), valor y un tipo.
Todos los objetos se copian por referencia. Por ejemplo,
>>> x=20
>>> y=x
>>> id(x)==id(y)
True
>>>
La única forma de tener una nueva instancia es creando una.
>>> x=3
>>> id(x)==id(y)
False
>>> x==y
False
Esto puede sonar complicado en primera instancia, pero para simplificar un poco, Python hizo algunos tipos inmutables. Por ejemplo, no puede cambiar un string
. Tienes que cortarlo y crear un nuevo objeto de cadena.
A menudo, copiar por referencia arroja resultados inesperados para ej.
x=[[0]*8]*8
puede darle la sensación de que crea una lista bidimensional de 0
s. Pero, de hecho, crea una lista de la referencia del mismo objeto de lista [0] s. Así que hacer x [1] [1] terminaría cambiando todas las instancias duplicadas al mismo tiempo.
El módulo Copy proporciona un método llamado deepcopy para crear una nueva instancia del objeto en lugar de una instancia superficial. Esto es beneficioso cuando tiene la intención de tener dos objetos distintos y manipularlos por separado tal como lo pretendía en su segundo ejemplo.
extender su ejemplo
>>> class Klasa:
def __init__(self, num):
self.num = num
>>> a = Klasa(2)
>>> b = copy.deepcopy(a)
>>> print a.num, b.num # prints 2 2
2 2
>>> a.num = 3
>>> print a.num, b.num # prints 3 3 - different!
3 2
Fuera del lenguaje Python, los términos por referencia/por valor ya son confusos y confusos. Dentro de Python, cuyo modelo de datos y modelo de ejecución son tan especiales, estos términos son aún más confusos y confusos y deben evitarse. Esa es mi opinión, pero tenga en cuenta que no soy un experto en Python. Ver (http://stackoverflow.com/a/986145/551449) y muchas otras publicaciones y blogs sobre este tema. Parece que necesita estudiar un poco más los datos y modelos de ejecución de Python – eyquem