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

Reply via email to