diff --git a/_drafts/python-object-replacement.md b/_drafts/python-object-replacement.md new file mode 100644 index 0000000..502a071 --- /dev/null +++ b/_drafts/python-object-replacement.md @@ -0,0 +1,75 @@ +--- +layout: post +title: Replacing Objects in Python +tags: Python +description: More reflection than you cared to ask for +draft: true +--- + +Today, we're going to demonstrate a fairly evil thing in Python, which I call +_object replacement_. + +## Review + +First, a recap on terminology here. You can skip this if you know Python well. + +In Python, _names_ are what most languages call "variables". They reference +_objects_. So when we do: + +{% highlight python %} + +a = [1, 2, 3, 4] + +{% endhighlight %} + +We are creating a list object with four integers, and binding it to the name +`a`: + +
[1, 2, 3, 4]
[Not supported by viewer]
a
[Not supported by viewer]
+ +In each of the following examples, we are creating new _references_ to the +list object, but we are never duplicating it. Each reference points to the same +memory address (which you can get using `id(a)`, but that's a CPython +implementation detail). + +{% highlight python %} + +b = a + +{% endhighlight %} + +{% highlight python %} + +c = SomeContainerClass() +c.data = a + +{% endhighlight %} + +{% highlight python %} + +def wrapper(L): + def inner(): + return L.pop() + return inner + +d = wrapper(a) + +{% endhighlight %} + +[insert charts here] + +Note that these references are all equal. `a` is no more valid a name for the +list than `b`, `c.data`, or `L` from the perspective of `d` (and +`d.func_closure[0].cell_contents` from the perspective of the outside world, +even though that's cumbersome and you would never do that in practice). As a +result, if you delete one of these references—explicitly with `del a`, or +implicitly if a name goes out of scope—then the other references are still +around, and object continues to exist. If all of an object's references +disappear, then Python's garbage collector will eliminate it. + +## Fishing for references with Guppy + +[...] + +So, what this boils down to is finding all references to a given object and +replacing them with another object.