What exactly is a python variable?
Terry Reedy
tjreedy at udel.edu
Thu Nov 17 12:41:54 EST 2016
On 11/17/2016 12:40 AM, Veek M wrote:
> In C:
> int x = 10;
> results in storage being allocated and type and location are fixed for
> the life of the program.
>
> In Python,
> x = 10
>
> causes an object '10' to be created but how exactly is 'x' handled?
> Symbol Table lookup at compile time?
Modules and class names are set into and gotten from a symbol table at
*runtime* (except that module globals start with some initial reserved
names). Globals() returns the modules symbol table, which is a dict.
To see the initialization, execute "print(globals())" on startup. For
CPython 3.6.0b3 executed via IDLE's shell:
>>> globals()
{'__name__': '__main__',
'__doc__': None,
'__package__': None,
'__loader__': <class '_frozen_importlib.BuiltinImporter'>,
'__spec__': None,
'__annotations__': {},
'__builtins__': <module 'builtins' (built-in)>}
Class dicts are created at runtime and also have default entries.
>>> class C: pass
>>> print(C.__dict__)
{'__module__': '__main__', '__dict__': <attribute '__dict__' of 'C'
objects>, '__weakref__': <attribute '__weakref__' of 'C' objects>,
'__doc__': None}
>>> print(dir(C)) # include attributes inherited from object.
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__',
'__format__', '__ge__', '__getattribute__', '__gt__', '__hash__',
'__init__', '__init_subclass__', '__le__', '__lt__', '__module__',
'__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
> Is every 'x' being substituted out of existence?
In CPython, function local names are replaced by int indexes into a list
of objects, but still 'exist'. They are kept with the code object as a
list. It is used for printing locals() and for disassembly output. The
latter is deceptive in this regard if you do not know that the names are
substituted back for the indexes).
The local namespace, an attribute code does not have any default entries.
>>> def f(): print(locals())
>>> f()
{}
The code object itself and the function object that wraps a code object
both have numerous special-name attributes.
--
Terry Jan Reedy
More information about the Python-list
mailing list