Como verificar se duas variáveis fazem referência ao mesmo objeto?
x = ['a', 'b', 'c']
y = x # x and y reference the same object
z = ['a', 'b', 'c'] # x and z reference different objects
Como verificar se duas variáveis fazem referência ao mesmo objeto?
x = ['a', 'b', 'c']
y = x # x and y reference the same object
z = ['a', 'b', 'c'] # x and z reference different objects
Respostas:
Isso isé para quê : x is yretorna Truese xe yforem o mesmo objeto.
x is zretorna False. Mas se x e z forem atribuídos aos mesmos valores em vez de listas (por exemplo x, z = 13, 13), então x is zretorna True. Por que é que?
xe zapontam. Uma vez que pequenos inteiros são comuns a falhas (-1 como um valor de erro, 0 sempre que você realmente indexar algo, pequenos números geralmente são valores padrão razoáveis) Python otimiza pré-alocando pequenos números (-5 a 256) e reutiliza o mesmo objeto inteiro. Portanto, seu exemplo só funciona para números neste intervalo. Tente atribuir algo maior, ou seja 270. Para mais informações olhada aqui
isverifica se dois nomes fazem referência ao mesmo local de memória. Não tem nada a ver com o próprio objeto. É fácil ter objetos imutáveis, como strings iguais, mas não armazenadas no mesmo local, por exemplo, ''a'*10000 is 'a' * 10000é False.
"af" is "af"ou () is ()... por que eles compartilham o mesmo local de memória?
y is xserá True, y is zserá False.
Enquanto as duas soluções corretas x is ze id(x) == id(z)já foram postadas, quero ressaltar um detalhe de implementação de python. Python armazena inteiros como objetos, como uma otimização, ele gera um monte de pequenos inteiros em seu início (-5 a 256) e aponta CADA variável que contém um inteiro com um pequeno valor para esses objetos pré-inicializados. Mais informações
Isso significa que para objetos inteiros inicializados com os mesmos pequenos números (-5 a 256), verificar se dois objetos são iguais retornará verdadeiro ( ON C-Pyhon , pelo que estou ciente, este é um detalhe de implementação ), enquanto para maiores números, isso só retorna verdadeiro se um objeto for inicializado do outro.
> i = 13
> j = 13
> i is j
True
> a = 280
> b = 280
> a is b
False
> a = b
> a
280
> a is b
True
Você também pode usar id () para verificar a qual objeto único cada nome de variável se refere.
In [1]: x1, x2 = 'foo', 'foo'
In [2]: x1 == x2
Out[2]: True
In [3]: id(x1), id(x2)
Out[3]: (4509849040, 4509849040)
In [4]: x2 = 'foobar'[0:3]
In [5]: x2
Out[5]: 'foo'
In [6]: x1 == x2
Out[6]: True
In [7]: x1 is x2
Out[7]: False
In [8]: id(x1), id(x2)
Out[8]: (4509849040, 4526514944)
Eu realmente gosto de ter um feedback visual, é por isso que às vezes apenas abro http://www.pythontutor.com/visualize.html#mode=edit para ver como a memória está alocada e o que está referenciando o quê.
Adicionado este gif incrível, pois esta resposta é sobre visualização.
Isso é de docs.python.org: "Cada objeto tem uma identidade, um tipo e um valor. A identidade de um objeto nunca muda depois de ser criado; você pode considerá-lo como o endereço do objeto na memória. O operador 'é' compara a identidade de dois objetos; a função id () retorna um número inteiro que representa sua identidade. "
Aparentemente, toda vez que você altera o valor, o objeto é recriado conforme indicado pela alteração da identidade. A linha x = 3 seguida pela linha x = 3,14 não dá nenhum erro e dá diferentes identidades, tipos e valores para x.