Ir ao conteúdo

Python como faço para apontar para o mesmo objeto de classe "primitiva" em python?


Ir à solução Resolvido por Kamuri,

Posts recomendados

Postado

desculpem-me se são perguntas meio bestas, estou tentando entender essa parte de memória, se  eu estiver errado me corrijam.

o que eu entendi foi :

que uma variável em python é um nome que guarda uma referência ao objeto de uma classe e não a um endereço na memória como em outras linguagens.

que o objeto é quem cuida da alocação e se não existir nenhuma referência do tipo "referência" para  seu "name" (uma  var ou objeto) o python libera o espaço de memória que ele ocupa para ser usado.

entendi que variáveis na verdade são de um único tipo chamado "referência a objeto" ou coisa assim.

 

como essas trocas e alocações estão ocorrendo no seguinte caso?

x  = []

x.append(3)

x  = str(x)

o que acontece com o objeto 3? e com o objeto [] da classe lista, quando é trocado por classe string?

se eu aplicar:

x= 3

consigo fazer outra variável referenciar o objeto "3" que a referencia x aponta sem criar uma cópia? como um "ponteiro de objeto"? é isso que as listas,tuplas e afins fazem?

  • Solução
Postado

São várias perguntas em uma. Vamos com calma.

Em Python, listas são definidas como:

typedef struct {
    PyObject_HEAD
    Py_ssize_t ob_size;

    /* Vector of pointers to list elements.  list[0] is ob_item[0], etc. */
    PyObject **ob_item;

    /* ob_item contains space for 'allocated' elements.  The number
     * currently in use is ob_size.
     * Invariants:
     *     0 <= ob_size <= allocated
     *     len(list) == ob_size
     *     ob_item == NULL implies ob_size == allocated == 0
     */
    Py_ssize_t allocated;
} PyListObject;

No caso, listas em python são arrays com tamanho dinâmico, quando um objeto é adicionado na lista, internamente um pointer (referencia para objeto) é criado nessa lista apontando para o objeto.

Quando você aplica o método str(), você está chamando a função __str__ da classe, caso ela não tenha, ele tenta usar o __repr__. Ou seja, a classe não está sendo convertida para string, ela está enviando para o método o modo como ela é representada (isso cabe ao programador decidir). Dá print em [3].__str__() e você vai ter como resultado '[3]'.

Sobre referenciar objetos com outras variaveis, Python já faz isso naturalmente.

Ex:

>>> x = 3
>>> y = 3
>>> id(x)
140389809553712
>>> id(y)
140389809553712

O endereço dos dois objetos são o mesmo, ambos são os mesmos objetos, isso é parte da definição do Python. E se você incluir qualquer um dos dois objetos acima, eles continuarão tendo o mesmo endereço, pois a lista vai apenas apontar para eles.

Já tipos imutáveis, como tuplas e strings, ocorre algo diferente. O endereço deles sempre vai mudar para evitar que o valor seja alterado. Ex:

>>> id("ax")
140389808254128
>>> id("ax")
140389808254256

E como são objetos imutáveis, não há como pegar o endereço deles e usar em outra parte. Deve ate ter algum método obscuro, mas no mínimo você vai acabar tendo um undefined beheavior.

 

Ps: Para fazer cópias de objetos mutáveis como listas, use o copy.deepcopy.

  • Obrigado 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!