Asked By – rombez
I’ve been searching for the accurate answer to this question for a couple of days now but haven’t got anything good. I’m not a complete beginner in programming, but not yet even on the intermediate level.
When I’m in the shell of Python, I type:
dir() and I can see all the names of all the objects in the current scope (main block), there are 6 of them:
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__']
Then, when I’m declaring a variable, for example
x = 10, it automatically adds to that lists of objects under built-in module
dir(), and when I type
dir() again, it shows now:
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'x']
The same goes for functions, classes and so on.
How do I delete all those new objects without erasing the standard 6 which where available at the beginning?
I’ve read here about “memory cleaning”, “cleaning of the console”, which erases all the text from the command prompt window:
>>> import sys >>> clear = lambda: os.system('cls') >>> clear()
But all this has nothing to do with what I’m trying to achieve, it doesn’t clean out all used objects.
Now we will see solution for issue: Is there a way to delete created variables, functions, etc from the memory of the interpreter?
You can delete individual names with
or you can remove them from the
for name in dir(): if not name.startswith('_'): del globals()[name]
This is just an example loop; it defensively only deletes names that do not start with an underscore, making a (not unreasoned) assumption that you only used names without an underscore at the start in your interpreter. You could use a hard-coded list of names to keep instead (whitelisting) if you really wanted to be thorough. There is no built-in function to do the clearing for you, other than just exit and restart the interpreter.
Modules you’ve imported (
import os) are going to remain imported because they are referenced by
sys.modules; subsequent imports will reuse the already imported module object. You just won’t have a reference to them in your current global namespace.
Python doesn’t make any security guarantees about data in memory however. When objects no longer are referenced the interpreter marks the memory as no longer in use but does not take steps to overwrite that memory to prevent access to data. If you need that level of security protection you’ll need to use third-party extensions that manage their own memory with security in mind.