Referências Python

Resumo : neste tutorial, você terá um bom entendimento das referências do Python e da contagem de referências.

Introdução às referências do Python

Em Python, uma variável não é o rótulo de um valor como você pode imaginar. Em vez disso, uma variável faz referência a um objeto que contém um valor. Em outras palavras, variáveis ​​são referências.

O exemplo a seguir atribui um número com o valor de 100a uma variável:

counter = 100Linguagem de código:  Python  ( python )

Nos bastidores, Python cria um novo objeto inteiro ( int) na memória e vincula a countervariável a esse endereço de memória:

Quando você acessa a countervariável, o Python procura o objeto referenciado por countere retorna o valor desse objeto:

print(counter) # 100Linguagem de código:  Python  ( python )

Portanto, variáveis ​​são referências que apontam para os objetos na memória.

Para encontrar o endereço de memória de um objeto referenciado por uma variável, você passa a variável para a função integrada id().

Por exemplo, o seguinte retorna o endereço de memória do objeto inteiro referenciado pela countervariável:

counter = 100
print(id(counter)) Linguagem de código:  Python  ( python )

Saída:

140717671523072Linguagem de código:  Python  ( python )

A id()função retorna o endereço de memória de um objeto referenciado por uma variável como um número de base 10.

Para converter este endereço de memória em uma string hexadecimal, você usa a hex()função:

counter = 100

print(id(counter)) 
print(hex(id(counter))) Linguagem de código:  Python  ( python )

Saída:

140717671523072
0x7ffb62d32300Linguagem de código:  Python  ( python )

Contagem de referência

Um objeto no endereço de memória pode ter uma ou mais referências. Por exemplo:

counter = 100Linguagem de código:  Python  ( python )

O objeto inteiro com valor 100 possui uma referência que é a countervariável. Se você atribuir a counteroutra variável, por exemplo max:

counter = 100
max = counterLinguagem de código:  Python  ( python )

Agora, ambas counteras maxvariáveis ​​e referenciam o mesmo objeto inteiro. O objeto inteiro com valor 100 possui duas referências:

Contagem de referências Python

Se você atribuir um valor diferente à maxvariável:

max = 999Linguagem de código:  Python  ( python )

…o objeto inteiro com valor 100 possui uma referência, que é a countervariável:

E o número de referências do objeto inteiro com valor 100 será zero se você atribuir um valor diferente à countervariável:

counter = 1Linguagem de código:  Python  ( python )

Quando um objeto não tiver nenhuma referência, o Python Memory Manager destruirá esse objeto e recuperará a memória.

Contando referências

Para obter o número de referências de um objeto, você usa o from_address()método do ctypesmódulo.

ctypes.c_long.from_address(address).valueLinguagem de código:  Python  ( python )

Para utilizar este método, você precisa passar o endereço de memória do objeto que deseja contar as referências. Além disso, o endereço precisa ser um número inteiro.

O seguinte define uma função chamada ref_count()que usa o from_address()método:

import ctypes


def ref_count(address):
    return ctypes.c_long.from_address(address).valueLinguagem de código:  Python  ( python )

Agora, você pode usar uma ref_count()função mais curta em vez de usar a sintaxe longa como acima.

Este exemplo define uma lista de três inteiros:

numbers = [1, 2, 3]Linguagem de código:  Python  ( python )

Para obter o endereço de memória da numberslista, você usa a id()função da seguinte forma:

numbers_id = id(numbers)
Linguagem de código:  Python  ( python )

A seguir mostra-se o número de referências da lista referenciada pela numbersvariável:

print(ref_count(numbers_id))  # 1Linguagem de código:  Python  ( python )

Retorna um porque apenas a numbersvariável faz referência à lista.

Isso atribui a numbersvariável a uma nova variável:

ranks = numbersLinguagem de código:  Python  ( python )

O número de referências da lista deve ser dois agora porque ela é referenciada pelas variáveis numbers​​and :ranks

print(ref_count(numbers_id)) # 2Linguagem de código:  Python  ( python )

Se você atribuir ranksvariável None, a contagem de referências da lista será reduzida para um:

ranks = None
print(ref_count(numbers_id))  # 1
Linguagem de código:  Python  ( python )

E se você atribuir a numbersvariável None, o número de referências da lista será zero:

numbers = None
print(ref_count(numbers_id))  # 0Linguagem de código:  Python  ( python )

Junte tudo:

import ctypes


def ref_count(address):
    return ctypes.c_long.from_address(address).value


numbers = [1, 2, 3]
numbers_id = id(numbers)

print(ref_count(numbers_id))  # 1

ranks = numbers
print(ref_count(numbers_id))  # 2

ranks = None
print(ref_count(numbers_id))  # 1

numbers = None
print(ref_count(numbers_id))  # 0Linguagem de código:  Python  ( python )

Resumo

  • Variáveis ​​Python são referências a objetos localizados na memória
  • Use a id()função para obter o endereço de memória do objeto referenciado por uma variável.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *