Finding the instance reference of an object
Steven D'Aprano
steve at REMOVE-THIS-cybersource.com.au
Sun Oct 19 07:42:11 EDT 2008
On Fri, 17 Oct 2008 09:56:17 -0600, Joe Strout wrote:
> On Oct 16, 2008, at 11:23 PM, Dennis Lee Bieber wrote:
>
>> On Thu, 16 Oct 2008 21:19:28 -0600, Joe Strout <joe at strout.net>
>> declaimed the following in comp.lang.python:
>>
>>> Now that IS mysterious. Doesn't calling a function add a frame to a
>>> stack? And doesn't that necessitate copying in values for the
>>> variables in that stack frame (such as 'x' above)? Of course we're
>>
>> No -- it copies the /reference/ to the object containing the value.
>
> The reference to the object IS the value of an object reference
> variable.
That's a bizarre and unnatural way of looking at it. To steal a line from
the effbot, that's like valuing your child's Social Security number over
the child herself:
http://mail.python.org/pipermail/python-list/2003-May/204560.html
If we execute a line of Python code:
x = "parrot"
and then ask "What's the value of x?", I think that even you would think
I was being deliberately obtuse, difficult and obfuscatory if I answered
"location 0xb7cdeb2c".
> So good, parameters are passed ByVal in Python as they appear
> to be, and as is the default in every other modern language.
Nonsense. Python doesn't copy a parameter before passing it to the
function. You get the same parameter inside the function as outside:
>>> def foo(x):
... print id(x)
...
>>> a = ['some', 'thing']
>>> print id(a); foo(a)
3083441036
3083441036
I'm going to anticipate your response here: you're going to deny that
call by value implies that the list ['some', 'thing'] will be copied
before being passed to the function. According to *some* definitions of
CBV, you might even be right. But according to *other* definitions,
including the one that I learned in comp sci at university, that copying
of data is an essential part of CBV.
These other definitions aren't necessarily a formal definition from some
Computer Scientist. They're just as likely to be informal understandings
of what CBV and CBR mean: "if it's call by value, don't pass big data
structures because they will be copied and your code will be slow".
>> Just as assignment transfers the reference to the RHS object to the
>> name
>> shown on the LHS.
>
> Assignment copies the RHS value to the LHS variable. In the case of an
> object reference, the value copied is, er, an object reference.
No, assignment binds an object to a name. That's what Python does.
Of course, at the implementation level, name binding might be implemented
by copying object references. Or it might not. That's an implementation
detail that isn't relevant at the Python level.
Or at least, it shouldn't be relevant until the abstraction leaks.
http://www.joelonsoftware.com/articles/LeakyAbstractions.html
[snip]
> For object references (including the mutable ones that may treat people
> up), Python's behavior is no different from any other language.
That's an exceedingly broad claim. No different from Java? Well, perhaps.
No different from Lisp? Doubtful. No different from Forth? Yeah, riiight.
Speaking of Java, there's one major difference between Java and Python
with respect to names. In a statically typed language like Java, you
define names before you use them, and from that point the name is bound
to both a type and an object. But the binding to the object is optional,
and such unbound names are said to be null.
In a dynamically typed language like Python, names are bound only to
objects. You can't have an unbound name: if a name exists, it must be
bound to an object, and if it doesn't exist, you get a NameError
exception when you try to access it. And objects are typed, not names.
http://www.ferg.org/projects/python_java_side-by-side.html
>>>> (Answer: neither. They are call by name.)
>>>
>>> I have no idea what that means. They're call by value as far as I can
>>> tell. (Even if the value may happen to be a reference.)
>>
>> Technically, as I recall the definition of "call by name", they
>> aren't that either. ...
>> Call by name, then, acted as a macro expansion wherever the argument
>> was referenced in the called function.
>
> Thanks for that explanation. Clearly that's not what's going on in
> Python.
Ah no, that's my bad. I have a strange and disturbing mental stutter that
substitutes "call by name" when I mean to say "call by object" at the
most embarrassing times. Sorry.
--
Steven
More information about the Python-list
mailing list