Ir ao conteúdo
  • Cadastre-se

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


Ir à solução Resolvido por Kamuri,

Posts recomendados

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?

Link para o comentário
Compartilhar em outros sites

  • Solução

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
Link para o comentário
Compartilhar em outros sites

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...