why () is () and [] is [] work in other way?

Terry Reedy tjreedy at udel.edu
Thu Apr 26 14:14:07 EDT 2012


On 4/26/2012 1:48 AM, John Nagle wrote:

> This assumes that everything is, internally, an object.  In CPython,
> that's the case, because Python is a naive interpreter and everything,
> including numbers, is "boxed". That's not true of PyPy or Shed Skin.
> So does "is" have to force the creation of a temporary boxed object?

Python Language Reference
"3.1. Objects, values and types
Objects are Python’s abstraction for data. All data in a Python program 
is represented by objects or by relations between objects. ...
Every object has an identity, a type and a value. An object’s identity 
never changes once it has been created; ... The ‘is‘ operator compares 
the identity of two objects; the id()function* returns an integer 
representing its identity#." [notes added]

* the built-in function bound to 'id' on startup.
# and that integer must not change for the lifetime of the object.

None of the above is CPython implementation detail.

What the spec 'forces' is observable behavior. Internal shortcuts are 
allowed. If an interpreter 'knows' that 'a' represents anything other 
than None, than it can evaluate 'a is None' as False without boxing 'a' 
anymore than it is already.

The object model above allows for an object to represent or consist of a 
collection of raw, non-object internal data fields. A list is a sequence 
of Python objects. A string is not; it is a sequence of 'characters' or 
'bytes'. Structs and arrays, including numpy arrays, are similar in 
containing non-object values. However, when single characters, bytes, or 
other binary values are extracted and exposed to Python code by indexing 
or iteration, they must be objectivized (or at least are in CPython).

Worrying about 'is' and 'id' forcing objectness is misplaced. Except for 
comparing an object to a pre-defined constant or sentinel, 'is' is 
mainly used for introspection and testing. The main use of 'id()' is to 
make unambiguous string representations of functions, classes, and modules.

The real 'culprits' for (potentially) forcing objectness are everyday 
indexing and iteration. Numpy avoids boxing internal binary values by 
providing functions that operate on numpy arrays *without* exposing the 
internal values at the Python level. I believe that psycho and now pypy 
can analyze a function to determine whether machine ints and floats can 
used without being boxed,

-- 
Terry Jan Reedy





More information about the Python-list mailing list