mirror of
https://github.com/python/cpython.git
synced 2025-07-07 19:35:27 +00:00
gh-126882: Fix indentation in code sample block (#126887)
This commit is contained in:
parent
58e334e143
commit
14a05a8f43
1 changed files with 75 additions and 81 deletions
|
@ -17,26 +17,26 @@ value returned by this function is always 1 more as the function also has a refe
|
|||
to the object when called):
|
||||
|
||||
```pycon
|
||||
>>> x = object()
|
||||
>>> sys.getrefcount(x)
|
||||
2
|
||||
>>> y = x
|
||||
>>> sys.getrefcount(x)
|
||||
3
|
||||
>>> del y
|
||||
>>> sys.getrefcount(x)
|
||||
2
|
||||
>>> x = object()
|
||||
>>> sys.getrefcount(x)
|
||||
2
|
||||
>>> y = x
|
||||
>>> sys.getrefcount(x)
|
||||
3
|
||||
>>> del y
|
||||
>>> sys.getrefcount(x)
|
||||
2
|
||||
```
|
||||
|
||||
The main problem with the reference counting scheme is that it does not handle reference
|
||||
cycles. For instance, consider this code:
|
||||
|
||||
```pycon
|
||||
>>> container = []
|
||||
>>> container.append(container)
|
||||
>>> sys.getrefcount(container)
|
||||
3
|
||||
>>> del container
|
||||
>>> container = []
|
||||
>>> container.append(container)
|
||||
>>> sys.getrefcount(container)
|
||||
3
|
||||
>>> del container
|
||||
```
|
||||
|
||||
In this example, `container` holds a reference to itself, so even when we remove
|
||||
|
@ -199,26 +199,26 @@ variable `A`, and one self-referencing object which is completely
|
|||
unreachable:
|
||||
|
||||
```pycon
|
||||
>>> import gc
|
||||
|
||||
>>> class Link:
|
||||
... def __init__(self, next_link=None):
|
||||
... self.next_link = next_link
|
||||
|
||||
>>> link_3 = Link()
|
||||
>>> link_2 = Link(link_3)
|
||||
>>> link_1 = Link(link_2)
|
||||
>>> link_3.next_link = link_1
|
||||
>>> A = link_1
|
||||
>>> del link_1, link_2, link_3
|
||||
|
||||
>>> link_4 = Link()
|
||||
>>> link_4.next_link = link_4
|
||||
>>> del link_4
|
||||
|
||||
# Collect the unreachable Link object (and its .__dict__ dict).
|
||||
>>> gc.collect()
|
||||
2
|
||||
>>> import gc
|
||||
>>>
|
||||
>>> class Link:
|
||||
... def __init__(self, next_link=None):
|
||||
... self.next_link = next_link
|
||||
...
|
||||
>>> link_3 = Link()
|
||||
>>> link_2 = Link(link_3)
|
||||
>>> link_1 = Link(link_2)
|
||||
>>> link_3.next_link = link_1
|
||||
>>> A = link_1
|
||||
>>> del link_1, link_2, link_3
|
||||
>>>
|
||||
>>> link_4 = Link()
|
||||
>>> link_4.next_link = link_4
|
||||
>>> del link_4
|
||||
>>>
|
||||
>>> # Collect the unreachable Link object (and its .__dict__ dict).
|
||||
>>> gc.collect()
|
||||
2
|
||||
```
|
||||
|
||||
The GC starts with a set of candidate objects it wants to scan. In the
|
||||
|
@ -439,9 +439,9 @@ These thresholds can be examined using the
|
|||
function:
|
||||
|
||||
```pycon
|
||||
>>> import gc
|
||||
>>> gc.get_threshold()
|
||||
(700, 10, 10)
|
||||
>>> import gc
|
||||
>>> gc.get_threshold()
|
||||
(700, 10, 10)
|
||||
```
|
||||
|
||||
The content of these generations can be examined using the
|
||||
|
@ -449,38 +449,32 @@ The content of these generations can be examined using the
|
|||
specifically in a generation by calling `gc.collect(generation=NUM)`.
|
||||
|
||||
```pycon
|
||||
>>> import gc
|
||||
>>> class MyObj:
|
||||
... pass
|
||||
...
|
||||
|
||||
# Move everything to the old generation so it's easier to inspect
|
||||
# the young generation.
|
||||
|
||||
>>> gc.collect()
|
||||
0
|
||||
|
||||
# Create a reference cycle.
|
||||
|
||||
>>> x = MyObj()
|
||||
>>> x.self = x
|
||||
|
||||
# Initially the object is in the young generation.
|
||||
|
||||
>>> gc.get_objects(generation=0)
|
||||
[..., <__main__.MyObj object at 0x7fbcc12a3400>, ...]
|
||||
|
||||
# After a collection of the youngest generation the object
|
||||
# moves to the old generation.
|
||||
|
||||
>>> gc.collect(generation=0)
|
||||
0
|
||||
>>> gc.get_objects(generation=0)
|
||||
[]
|
||||
>>> gc.get_objects(generation=1)
|
||||
[]
|
||||
>>> gc.get_objects(generation=2)
|
||||
[..., <__main__.MyObj object at 0x7fbcc12a3400>, ...]
|
||||
>>> import gc
|
||||
>>> class MyObj:
|
||||
... pass
|
||||
...
|
||||
>>> # Move everything to the old generation so it's easier to inspect
|
||||
>>> # the young generation.
|
||||
>>> gc.collect()
|
||||
0
|
||||
>>> # Create a reference cycle.
|
||||
>>> x = MyObj()
|
||||
>>> x.self = x
|
||||
>>>
|
||||
>>> # Initially the object is in the young generation.
|
||||
>>> gc.get_objects(generation=0)
|
||||
[..., <__main__.MyObj object at 0x7fbcc12a3400>, ...]
|
||||
>>>
|
||||
>>> # After a collection of the youngest generation the object
|
||||
>>> # moves to the old generation.
|
||||
>>> gc.collect(generation=0)
|
||||
0
|
||||
>>> gc.get_objects(generation=0)
|
||||
[]
|
||||
>>> gc.get_objects(generation=1)
|
||||
[]
|
||||
>>> gc.get_objects(generation=2)
|
||||
[..., <__main__.MyObj object at 0x7fbcc12a3400>, ...]
|
||||
```
|
||||
|
||||
|
||||
|
@ -563,18 +557,18 @@ the current tracking status of the object. Subsequent garbage collections may ch
|
|||
tracking status of the object.
|
||||
|
||||
```pycon
|
||||
>>> gc.is_tracked(0)
|
||||
False
|
||||
>>> gc.is_tracked("a")
|
||||
False
|
||||
>>> gc.is_tracked([])
|
||||
True
|
||||
>>> gc.is_tracked(())
|
||||
False
|
||||
>>> gc.is_tracked({})
|
||||
True
|
||||
>>> gc.is_tracked({"a": 1})
|
||||
True
|
||||
>>> gc.is_tracked(0)
|
||||
False
|
||||
>>> gc.is_tracked("a")
|
||||
False
|
||||
>>> gc.is_tracked([])
|
||||
True
|
||||
>>> gc.is_tracked(())
|
||||
False
|
||||
>>> gc.is_tracked({})
|
||||
True
|
||||
>>> gc.is_tracked({"a": 1})
|
||||
True
|
||||
```
|
||||
|
||||
Differences between GC implementations
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue