Referansetelling i CPython
Forstå hvordan CPython følger objektenes levetid med referansetellere.
Referansetelling i CPython er en gratis leksjon i Python Academy på CoddyKit. Dette er leksjon 1 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Python Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Python Academy inneholder totalt 4 leksjoner.
Hva er referansetelling?
CPython holder oversikt over referansetellingen til hvert objekt. Når tellingen synker til 0, blir objektet umiddelbart deallokert. Dette er Pythons viktigste mekanisme for minnehåndtering.
import sys
x = [1, 2, 3]
print(sys.getrefcount(x)) # 2 (x + getrefcount arg)
y = x
print(sys.getrefcount(x)) # 3sys.getrefcount()
sys.getrefcount(obj) returnerer gjeldende referansetelling. Merk: kallet legger til 1 (referansen fra funksjonsargumentet).
import sys
a = "hello"
print(sys.getrefcount(a)) # baseline (may be high for interned strings)
b = a
print(sys.getrefcount(a)) # one more
del b
print(sys.getrefcount(a)) # back to baselineØkning og reduksjon
Hver tilordning øker tellingen, mens hver sletting eller ny tilordning reduserer den. Når tellingen når 0, kaller CPython objektets deallokeringsfunksjon.
x = [] # refcount = 1
y = x # refcount = 2
z = [x] # refcount = 3 (list holds a reference)
del y # refcount = 2
z.clear() # refcount = 1
del x # refcount = 0 → deallocatedObjektinterning
CPython internlagrer små heltall (-5 til 256) og mange strengliteraler, slik at samme objekt brukes om igjen. is-sammenligninger avslører dette.
a = 256
b = 256
print(a is b) # True (interned)
c = 257
d = 257
print(c is d) # may be False (not interned)Svake referanser
Svake referanser øker ikke referansetellingen. De er nyttige for å unngå at objekter De vil observere, men ikke eie, hindres i å bli samlet inn.
import weakref
class BigObject:
pass
obj = BigObject()
ref = weakref.ref(obj)
print(ref()) # <BigObject instance>
del obj
print(ref()) # None (object was collected)Referansesykluser
Hvis A refererer til B og B refererer til A, når ingen av dem 0 selv når begge er utilgjengelige. CPythons sykliske GC oppdager og samler inn disse.
a = []
b = [a]
a.append(b) # cycle: a → b → a
del a, b
# Both are unreachable but refcount > 0
# The cyclic GC collects themgc-modulen
gc-modulen tilbyr den sykliske søppelinnsamleren. Den kjører automatisk, men kan utløses manuelt eller deaktiveres.
import gc
gc.collect() # force a collection cycle
print(gc.get_count()) # (gen0, gen1, gen2) allocation counts
print(gc.get_threshold()) # when each generation is collectedMinnepooler (pymalloc)
CPython allokerer små objekter (< 512 byte) fra sin egen minnepool (pymalloc), noe som er raskere enn å kalle malloc for hvert lite objekt.
# You do not call pymalloc directly — CPython uses it internally
# for all Python-level object allocations
# The pool pre-allocates large memory arenas
# and carves them into pools of fixed-size blocksFinalisatorer med __del__
__del__ kalles når et objekts referansetelling når 0, eller senere hvis objektet inngår i en syklus. Unngå å være avhengig av det for kritisk opprydding – bruk kontekstbehandlere i stedet.
class Resource:
def __del__(self):
print(f"Freeing {self}")
# Better: use context manager
class SafeResource:
def __enter__(self): return self
def __exit__(self, *a): self.cleanup()Kompakte objekter med __slots__
Objekter med __slots__ bruker mindre minne og færre allokeringer, noe som reduserer belastningen på GC.
import sys
class Reg:
def __init__(self, x, y): self.x, self.y = x, y
class Slotted:
__slots__ = ("x","y")
def __init__(self, x, y): self.x, self.y = x, y
print(sys.getsizeof(Reg(1,2))) # ~48 + dict overhead
print(sys.getsizeof(Slotted(1,2))) # ~48 (no dict)Deaktivere syklisk GC
For programmer som ikke oppretter referansesykluser, kan deaktivering av syklisk GC forbedre gjennomstrømningen.
import gc
gc.disable() # no cyclic GC — objects are only freed by refcounting
# Use only if you KNOW no cycles are created
# (pure functional/immutable data)
gc.enable() # re-enableHurtigsjekk
Når deallokerer CPython et objekt umiddelbart?
Oppsummering
CPython holder oversikt over objekter via referansetellinger. Tellingen når 0 → umiddelbar deallokering. Referansesykluser håndteres av den sykliske GC-en (gc-modulen). Unngå __del__ for kritisk opprydding; bruk kontekstbehandlere. Bruk __slots__ for å redusere minnebruken per objekt.
Lær deg Python med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 76
- Leksjoner
- 320
Ofte stilte spørsmål
Er leksjonen «Referansetelling i CPython» gratis?
Ja – hele teksten i «Referansetelling i CPython» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Python Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Python Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Referansetelling i CPython»?
Forstå hvordan CPython følger objektenes levetid med referansetellere. Du øver på Python Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Python Academy?
Ingen tidligere erfaring er nødvendig. Python Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.
Hvor lang tid tar leksjonen «Referansetelling i CPython»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Python Academy-leksjonen?
Ja. Alle Python Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Referansetelling i CPython
- Garbage collector og sykliske referanser
- Profilering med cProfile og line_profiler
- Minneprofilering med tracemalloc