On Tuesday, May 30th, 2023 at 10:18 PM, Chris Angelico wrote: > Yep, what you're seeing there is the namespace and nothing else. But > if you mess with an actual builtin object, it'll be changed for the > other interpreter too. > > > > > import ctypes > > > > ctypes.cast(id(42), ctypes.POINTER(ctypes.c_int))[6] = 43 > > > > 41+1 > > 43 > > > > > from code import InteractiveInterpreter > > > > interp = InteractiveInterpreter() > > > > interp.runcode("print(41+1)") > > 43 > > (Note that this only works in CPython and only with integers small > enough to be in the cache, meaning that there is only one such object > representing that integer.) > > The same is true of C extensions, which often have their own internal > state, and that state isn't isolated to a single interpreter. > > Better isolation is coming with PEP 554 > https://peps.python.org/pep-0554/ which also has some great > information about what currently is NOT isolated. (Also, even then, > some things won't be fully isolated; I think that the ctypes trick > above might still affect a subinterpreter even in a post-PEP554 > world.)
Amazing example! Thank you everyone for the detailed responses - will be sure to check out the PEP as well. Jim -- https://mail.python.org/mailman/listinfo/python-list