On 8/4/2017 7:11 PM, Jon Forrest wrote:
Consider the following Python shell session (Python 3.6.2, Win64):
>>> def givemetwo():
... x = 'two'
... print(id(x))
...
>>> givemetwo()
1578505988392
So far fine. My understanding of object existence made me
think that the object referred to by x would be deleted when
the givemetwo() function returned, like a local variable in C.
Python does not specifically delete objects. It deletes references to
objects, such as an association between a name and an object, or between
a key and an object, or between a sequence index and an object. When a
function returns, associations between local names and object are
deleted. Python on a machine does not necessarily spend time 'cleaning'
memory by overwriting it with 0s.
However, this isn't true, as shown by the following in the same
session:
>>> import ctypes
Most everything you see in the manuals (and on this list) has a little *
after it.
* unless one imports and uses ctypes (or 3rd party modules).
For instance, 'Python code, even if buggy, should not crash the
interpreter'* and 'If you find such code, it is a bug'*, 'Please open an
issue on the tracker'*. If you use ctypes, please don't.
>>> print (ctypes.cast(1578505988392, ctypes.py_object).value)
two
This shows that the object still exists, which was a surprise.
Will this object ever be deleted?
What do you mean deleted? At this point, you are not looking at a normal
Python object, as such, but rather the contents of a segment of machine
memory at a particular address, extracted into a ctypes.py_object
object. I don't think you want that chunk of memory destroyed.
The only public attribute of the ctypes.py_object object is .value. It
has a few undocumented private attributes, such as ._b_needsfree_ which,
when I tried it, is 1.
--
Terry Jan Reedy
--
https://mail.python.org/mailman/listinfo/python-list