IsString
Tom Anderson
twic at urchin.earth.li
Wed Dec 14 14:10:57 EST 2005
On Wed, 14 Dec 2005, Steven D'Aprano wrote:
> On Tue, 13 Dec 2005 15:28:32 +0000, Tom Anderson wrote:
>
>> On Tue, 13 Dec 2005, Steven D'Aprano wrote:
>>
>>> On Mon, 12 Dec 2005 18:51:36 -0600, Larry Bates wrote:
>>>
>>> [snippidy-doo-dah]
>>>
>>>> I had the same thought, but reread the post. He asks "if a given
>>>> variable is a character or a number". I figured that even if he is
>>>> coming from another language he knows the difference between "a given
>>>> variable" and the "contents of a give variable". I guess we will
>>>> see.... ;-). This list is so good, he gets BOTH questions answered.
>>>
>>> The problem is, Python doesn't have variables (although it is
>>> oh-so-tempting to use the word, I sometimes do myself). It has names in
>>> namespaces, and objects.
>>
>> In what sense are the names-bound-to-references-to-objects not variables?
>
> Because saying "Python has variables" leads to nonsense like the following:
>
> [snip]
>>> That's why, for instance, Python is neither call by reference nor call
>>> by value, it is call by object.
>>
>> No, python is call by value, and it happens that all values are
>> pointers.
>
> All values in Python are pointers???
Right.
> So when I write:
>
> name = "spam spam spam spam"
>
> the value of the variable "name" is a pointer, and not a string. Riiight.
Right.
> Call by value and call by reference have established meanings in
> computer science,
Right.
> and Python doesn't behave the same as either of them.
Wrong. Python behaves exactly like call by value, just like Smalltalk,
Objective C, LISP, Java, and even C.
> Consider the following function:
>
> def modify(L):
> "Modify a list and return it."
> L.append(None); return L
>
> If I call that function:
>
> mylist = range(10**10) # it is a BIG list
> anotherlist = modify(mylist)
>
> if the language is call by value, mylist is DUPLICATED before being
> passed to the function.
Wrong. The value of mylist is a pointer to a list, and that's what's
passed to the function. The same analysis applies to the rest of your
example.
> The conceptual problem you are having is that you are conflating the
> object model of Python the language with the mechanism of the underlying
> C implementation, which does simply pass pointers around.
No, i'm not, i'm really not. Thinking in terms of variables, pointers and
objects is a simple, consistent and useful abstract model of computation
in python. If you like, we can use the word 'reference' instead of
'pointer' - i guess a lot of people who came from C (which i didn't) are
hung up on the idea that a pointer is a memory address, rather than just a
conceptual thing which goes from a variable to an object; the trouble is
that then we remind people of 'call by reference', and it all goes to pot.
I think the background thing is the kicker here. I'm guessing you come
from C, where pointers are physical and explicit, you can have a variable
which really does contain an object, etc, and so for you, applying those
terms to python is awkward. I come from java, where all pointers are
abstract (in the sense of being opaque) and implicit, and variables only
ever contain pointers (unless they're primitive - but that's an
implementation detail), so the terminology carries over to python quite
naturally.
>> I'm sure this has been argued over many times here, and we still all
>> have our different ideas, so please just ignore this post!
>
> I'd love to, but unfortunately I've already hit send on my reply.
Fair enough. Sorry about all this. In future, i'm going to send posts
which i *know* will generate heat but no light straight to /dev/null ...
tom
--
The literature, especially in recent years, has come to resemble `The
Blob', growing and consuming everything in its path, and Steve McQueen
isn't going to come to our rescue. -- The Mole
More information about the Python-list
mailing list