Referência de objetos python

135 views
Skip to first unread message

Luiz Henrique

unread,
Jul 24, 2016, 9:37:57 AM7/24/16
to Python Brasil
Pessoal bom dia

Estou com uma dúvida a respeito das referências de objeto do python

se eu tenho um objeto A do tipo int com o valor 500 e o id dele é "X". Quando crio um novo objeto B que seja igual a A o id dele também vai ser "X"
quando mudo o valor de A o id dele muda, porque agora ele faz referência a outro valor de int.
A minha dúvida é quando volto o valor de A ao mesmo que ele era antes, 500, o id(referencia) dele não tinha que ser o mesmo que B que tem o mesmo valor(500)?
Seria como seu tivesse criado dois objetos na memoria pro mesmo valor

Hermogenes Batista

unread,
Jul 24, 2016, 12:06:06 PM7/24/16
to python...@googlegroups.com
Não sei se entendi direito, mas nessa classe você está usando o pattern Singleton? Porque ao instanciar objetos da mesma classe, o python cria referências diferentes para estes objetos, se você deseja compartilhar o estado interno entre todas as instâncias, deve-se usar o pattern que citei (ou o Borg[1]). Caso contrário, mesmo que o usemos o mesmo atributo "x" em outras instâncias, sua referência será diferente. Segue um gist exemplificando o que disse (PS: Não implementei o Singleton para mostrar o compartilhamento do estado interno dos atributos):


--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com

---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Hermogenes Batista

Sistemas de Informação - UFAL

Matheus Pereira

unread,
Jul 25, 2016, 10:06:12 AM7/25/16
to Python Brasil
Fala Luiz, não sei se entendi sua pergunta e também não conheço muito a fundo o funcionamento de Python.
Vou tentar responder, caso esteja equivocado a galera da lista pode me corrigir.

O início deste post pode te ajudar: https://pythonhelp.wordpress.com/2013/02/20/variaveis-valores-e-referencias/

Quando você cria uma variável do tipo int, você só está criando um nome para acessar um objeto int. Este objeto terá o mesmo id enquanto estiver na memória.

Fiz uns testes no terminal para exemplificar: Durante a execução o inteiro "10" permaneceu com id "17375360" e o inteiro "20" com id "17375120".

In [1]: aa = 10

In [2]: id(aa)
Out[2]: 17375360

In [3]: bb = 10

In [4]: id(bb)
Out[4]: 17375360

In [5]: aa = 20

In [6]: id(aa)
Out[6]: 17375120

In [7]: aa = 10

In [8]: id(aa)
Out[8]: 17375360

In [9]: id(20)
Out[9]: 17375120

In [10]: id(10)
Out[10]: 17375360


Essas referências irão mudar quando o Python tirá-los da memória, mas acho que isso não vai acontecer enquanto você estiver usando o objeto e tiver memória suficiente para mantê-lo.

Quando Python tira um objeto de memória vai depender da implementação do garbage collector, estes dois links podem te dar uma ideia do funcionamento.

https://www.quora.com/How-does-garbage-collection-in-Python-work
http://effbot.org/pyfaq/how-does-python-manage-memory.htm

José Luis Segatto Junior

unread,
Jul 25, 2016, 10:40:50 AM7/25/16
to python...@googlegroups.com
Em objetos int, sempre que você atribuir um novo valor, um novo objeto será criado na memória. O fato de já existir um int com um valor na memória não implica que ele será referenciado novamente para cada variável com o mesmo valor. É mais rápido para o Python pedir uma nova instância ("quero um espaço de memória do tamanho x") para o sistema operacional, do que verificar em todas as suas instâncias se alguma é igual a que ele precisa criar e só pedir uma nova caso não exista uma igual.
Eu to começando, venho do C com algumas pinceladas em C++, acho que lá fica mais fácil de entender essas questões por você poder criar um ponteiro para uma variável, criar a variável em si (alocar dinamicamente) e ter a obrigação desalocar depois...

--

José Luis Segatto Junior

unread,
Jul 25, 2016, 10:48:10 AM7/25/16
to python...@googlegroups.com
Vish, acho que eu to enganado...
Agora que vi a resposta do Matheus. Fiz os mesmos testes aqui e obtive os mesmos resultados. Curioso, quando você atribui à uma variável um valor que está atribuído a uma instância já existente o Python reaproveita a instância e não cria uma nova. Menos uso de memória. Interessante.

Reply all
Reply to author
Forward
0 new messages