Private data

Gabriel Genellina gagsl-py2 at
Mon Mar 19 01:54:08 CET 2007

En Sun, 18 Mar 2007 10:21:27 -0300, Dustan <DustanGroups at>  

>>>> dis.dis(testPrivateStaticFunctionVariables)
>  21           0 LOAD_DEREF               0 (func)
>               3 LOAD_DEREF               1 (internalData)
>               6 LOAD_FAST                0 (args)
>               9 CALL_FUNCTION_VAR        1
>              12 RETURN_VALUE
> What's the difference between 'LOAD_DEREF', 'LOAD_FAST', and
> 'LOAD_CONST', and, as seen at,
> 'LOAD_GLOBAL'? I can imagine that 'LOAD_GLOBAL' loads a global, but
> seeing as python is such a dynamic language, how exactly is it
> supposed to distinguish between them?

The Python interpreter executes a stack-based machine. Look at  
Python/compile.c for the code generation and Python/ceval.c for the code  
LOAD_CONST pushes a constant onto the stack (all constants are previously  
built and stored as attribute co_consts of the code object). LOAD_FAST and  
LOAD_GLOBAL pushes a local or global variable reference. (The compiler  
knows whether a name is local or not, just by lexical analysis).  
LOAD_DEREF appears to be used for accessing variables inside closures, I'm  
not sure.

> I don't understand the following at all: 'DUP_TOP', 'ROT_TWO'. Any
> pointers?

They manipulate the stack. DUP_TOP duplicates the top entry; ROT_TWO swaps  
the two top entries.

> What does 'INPLACE_ADD' mean, if not in place addition, and if it is
> in place addition, why does it need to 'STORE_ATTR' afterward?

That corresponds to A += B. The compiler can't know if A has or not an  
__iadd__ method; even if A implements __iadd__, that method could return a  
different object, not always A (it *may* try to do the operation inplace,  
but that might not always be possible). When the inplace method is not  
implemented, __add__ is used (so effectively A += B is computed as A = A+B)

Gabriel Genellina

More information about the Python-list mailing list