Referensräkning i CPython
Förstå hur CPython håller reda på objekts livslängd med referensräknare.
Referensräkning i CPython är en gratis lektion i Python Academy på CoddyKit. Detta är lektion 1 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Python Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Python Academy innehåller totalt 4 lektioner.
Vad är referensräkning?
CPython håller reda på varje objekts referensantal. När antalet sjunker till 0 avallokeras objektet omedelbart. Detta är Pythons primära mekanism för minneshantering.
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) returnerar det aktuella referensantalet. Obs! Att anropa funktionen lägger till 1, eftersom funktionsargumentet utgör en referens.
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Öka och minska
Varje tilldelning ökar referensantalet, medan varje borttagning eller omtilldelning minskar det. När antalet når 0 anropar CPython objektets avallokeringsfunktion.
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 → deallocatedObjektinternisering
CPython interniserar små heltal (−5 till 256) och många strängliteraler genom att återanvända samma objekt. Jämförelser med is visar detta.
a = 256
b = 256
print(a is b) # True (interned)
c = 257
d = 257
print(c is d) # may be False (not interned)Svaga referenser
Svaga referenser ökar inte referensantalet. De är användbara för att undvika att hindra skräpsamling av objekt som ni vill observera men inte äga.
import weakref
class BigObject:
pass
obj = BigObject()
ref = weakref.ref(obj)
print(ref()) # <BigObject instance>
del obj
print(ref()) # None (object was collected)Referenscykler
Om A refererar till B och B refererar till A når ingen av dem 0, inte ens när båda är onåbara. CPythons cykliska GC upptäcker och samlar in dem.
a = []
b = [a]
a.append(b) # cycle: a → b → a
del a, b
# Both are unreachable but refcount > 0
# The cyclic GC collects themModulen gc
Modulen gc tillhandahåller den cykliska skräpsamlaren. Den körs automatiskt men kan utlösas manuellt eller inaktiveras.
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 collectedMinnespooler (pymalloc)
CPython allokerar små objekt (< 512 byte) från sin egen minnespool (pymalloc), vilket är snabbare än att anropa malloc för varje litet 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 blocks__del__-slutbehandlare
__del__ anropas när ett objekts referensantal når 0, eller senare om objektet ingår i en cykel. Förlita er inte på den för kritisk rensning – använd i stället kontexthanterare.
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()Kompakta objekt med __slots__
Objekt med __slots__ använder mindre minne och kräver färre allokeringar, vilket minskar 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)Inaktivera den cykliska GC:n
För program som inte skapar referenscykler kan inaktivering av den cykliska GC:n förbättra genomströ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-enableSnabbkontroll
När avallokerar CPython ett objekt omedelbart?
Sammanfattning
CPython håller reda på objekt med hjälp av referensantal. När antalet når 0 sker omedelbar avallokering. Referenscykler hanteras av den cykliska GC:n (modulen gc). Undvik __del__ för kritisk rensning och använd kontexthanterare. Använd __slots__ för att minska minnesåtgången per objekt.
Lär dig Python med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 76
- Lektioner
- 320
Vanliga frågor
Är lektionen ”Referensräkning i CPython” gratis?
Ja – hela texten till ”Referensräkning i CPython” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Python Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i Python Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Referensräkning i CPython”?
Förstå hur CPython håller reda på objekts livslängd med referensräknare. Ni övar på Python Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Python Academy?
Du behöver inga förkunskaper. Utbildningen i Python Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 1 av 4.
Hur lång tid tar lektionen ”Referensräkning i CPython”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Python Academy-lektionen?
Ja. Varje Python Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Referensräkning i CPython
- Skräpsamlaren och cykliska referenser
- Profilering med cProfile och line_profiler
- Minnesprofilering med tracemalloc