Em Python, criei objetos inteiros e de lista da seguinte maneira:
a = 10
b = 10
x = []
y = []
Então eu obtenho os seguintes resultados ao comparar o id de a
e b
e o id de x
e y
id(a)==id(b) returns True
id(x)==id(y) returns False
Em algum lugar eu li que a atribuição em Python nunca copia dados. Minha pergunta é por que xey não tem o mesmo id?
Respostas:
1 para resposta № 1Você deve saber que inteiros python são armazenados em cache e inmutable, isso significa que ambos a
e b
estão rotulando o mesmo 10
. Listas são objetos e eles são alocados separadamente, é por isso que seus ids são diferentes desde o início
1 para resposta № 2
As listas são mutáveis, se o mesmo objeto fosse usado, quando você adicionasse um item a uma lista, você também veria a mudança na outra.
A identidade de inteiros depende da implementação e geralmente é válida apenas para números pequenos; boa leitura Aqui.
A propósito, ==
é o operador de igualdade. Um caminho mais curto (e mais limpo) para id(a)==id(b)
é usar o operador de identidade is
. No seu caso: a is b
.
0 para resposta № 3
x = []
é uma abreviação para instanciar uma nova lista, o que significa um novo objeto com um novo ID de objeto. Apesar de x
e y
são designadas como listas vazias, elas são simplesmente referências a locais de memória alocados para as respectivas listas. E se id(x) == id(y)
então x
e y
compartilhariam o mesmo ID de objeto, o que efetivamente significaria que eles compartilham um local de memória ou são referências ao mesmo objeto (portanto, quaisquer alterações feitas em um se aplicariam ao outro).
Por outro lado, id(a) == id(b)
porque ambos são inteiros, que são tipos de dados primitivos.