Understanding python functions - Instant Python tutorial
Steve Holden
steve at holdenweb.com
Fri Jul 13 14:38:18 EDT 2007
Chris Mellon wrote:
> On 7/13/07, Chris Carlen <crcarleRemoveThis at bogussandia.gov> wrote:
>> Ben Finney wrote:
>>> Chris Carlen <crcarleRemoveThis at BOGUSsandia.gov> writes:
>
>>> That's not how Python works. Every value is an object; the assignment
>>> operator binds a name to an object. This is more like writing the name
>>> on a sticky-note, and sticking it onto the object.
>>>
>>> * The object itself doesn't change or "move".
>>>
>>> * The object can be referred to by that name, but isn't "inside" the
>>> name in any way.
>>>
>>> * Assigning multiple names to the same object just means you can
>>> refer to that same object by all those names.
>>>
>>> * When a name goes away, the object still exists -- but it can't be
>>> referred to if there are no longer any names left on it.
>>>
>>> * Assigning a different object to an existing name just means that
>>> the same sticky-note has moved from the original object to the new
>>> one. Referring to the same name now references a different object,
>>> while the existing object keeps all the other names it had.
>> Excellent description. This understandable to me since I can envision
>> doing this with pointers. But I have no idea how Python actually
>> implements this. It also appears that I am being guided away from
>> thinking about it in terms of internal implementation.
>>
>
> I assume that you're familiar with the general concept of hash tables.
> Scopes in Python are hash tables mapping strings to Python objects.
> Names are keys into the hash table.
>
> a = 10
>
> is the same as
> currentScope["a"] = 10
>
> print a
>
> is the same as
> print currentScope["a"]
>
> As you can see, there's no way that assignment can result in any sort
> of sharing. The only way that changes can be seen between shared
> objects is if they are mutated via mutating methods.
>
> Python objects (the values in the hashtable) are refcounted and can be
> shared between any scope.
>
>>> When you pass an object as a parameter to a function, the object
>>> receives a new sticky-label: the parameter name under which it was
>>> received into the function scope. Assignment is an act of binding a
>>> name to an object; no new object is created, and it still has all the
>>> other names it had before.
>
> Each scope is it's own hashtable. The values can be shared, but not
> the keys. When you call a function, the objects (retrieved from the
> callers local scope by name) are inserted into the functions local
> scope, bound to the names in the function signature. This is what
> Guido calls "call by object reference".
>
This is, of course, something of an oversimplification. First, the
global statement allows you to modify a name of module scope from inside
another scope such as a functions.
>
>
>> Ok, so I can understand the code above now.
>>
>> In the first case I pass the reference to the list to change(). In the
>> function, some_list is another name referring to the actual object
>> [1,2,3]. Then the function changes the object referred to by the second
>> element of the list to be a 4 instead of a 2. (Oh, the concept applies
>> here too!) Out of the function, the name x refers to the list which has
>> been changed.
>>
>> In the second case, y refers to a '1' object and when the function is
>> called the object 1 now gets a new reference (name) x inside the
>> function. But then a new object '0' is assigned to the x name. But the
>> y name still refers to a '1'.
>>
>> I get it. But I don't like it. Yet. Not sure how this will grow on me.
>>
>
> You need to learn about Pythons scoping now, not it's object passing
> semantics. When you're used to thinking in terms of pointers and
> memory addresses it can take some work to divorce yourself from those
> habits.
Then, of course, there are the nested scoping rule for functions defined
inside other functions.
regards
Steve
--
Steve Holden +1 571 484 6266 +1 800 494 3119
Holden Web LLC/Ltd http://www.holdenweb.com
Skype: holdenweb http://del.icio.us/steve.holden
--------------- Asciimercial ------------------
Get on the web: Blog, lens and tag the Internet
Many services currently offer free registration
----------- Thank You for Reading -------------
More information about the Python-list
mailing list