Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Re: Simple object reference

0 views
Skip to first unread message

Chris Rebert

unread,
Nov 14, 2009, 6:40:05 PM11/14/09
to AON LAZIO, pytho...@python.org
On Sat, Nov 14, 2009 at 3:25 PM, AON LAZIO <aonl...@gmail.com> wrote:
> Hi, I have some problem with object reference
> Say I have this code
>
> a = b = c = None
> slist = [a,b,c]

Values are stored in the list, not references to names. Modifying the
list does not change what values the names a, b, and c have. There is
no Python-level notion of pointers.

> for i in range(len(slist)):
> slist[i] = 5

This modifies the contents of the list, it does not affect any other
variables/names.

> print slist
> print a,b,c
>
> I got this
> [5, 5, 5]
> None None None
>
>     Question is how can I got all a,b,c variable to have value 5 also?

Use tuple unpacking:

#at start of code
slist = [None]*3
#...
#at end of code
a, b, c = slist

I would also recommend reading
http://effbot.org/zone/call-by-object.htm for a good explanation of
how Python's variables work.

Cheers,
Chris
--
http://blog.rebertia.com

Ben Finney

unread,
Nov 14, 2009, 7:36:25 PM11/14/09
to
Chris Rebert <cl...@rebertia.com> writes:

> On Sat, Nov 14, 2009 at 3:25 PM, AON LAZIO <aonl...@gmail.com> wrote:
> > Hi, I have some problem with object reference
> > Say I have this code
> >
> > a = b = c = None
> > slist = [a,b,c]
>
> Values are stored in the list, not references to names. Modifying the
> list does not change what values the names a, b, and c have. There is
> no Python-level notion of pointers.

There *is*, though, a notion of references, which is what the OP is
asking about. The list does not store values, it stores references to
values (just as a name references a value).

You're right that the names are irrelevant for the items in the list;
the name ‘a’ and the item ‘slist[0]’ are always independent references.

> > for i in range(len(slist)):
> > slist[i] = 5

Hence, this has no effect on what the names ‘a’, ‘b’, ‘c’ reference;
those names continue to reference whatever they were already
referencing. It is changing only what the list items ‘slist[0]’,
‘slist[1]’, ‘slist[2]’ reference.

> I would also recommend reading
> http://effbot.org/zone/call-by-object.htm for a good explanation of
> how Python's variables work.

Yes, the Effbot's explanations are good.

It's also worth noting that the Python reference documentation has
become much more readable recently, and the language reference has good
explanations of the data model
<URL:http://docs.python.org/reference/datamodel.html#objects-values-and-types>
and what assignment statements do
<URL:http://docs.python.org/reference/simple_stmts.html#assignment-statements>.

--
\ “As we enjoy great advantages from the inventions of others, we |
`\ should be glad to serve others by any invention of ours; and |
_o__) this we should do freely and generously.” —Benjamin Franklin |
Ben Finney

Terry Reedy

unread,
Nov 14, 2009, 9:53:39 PM11/14/09
to pytho...@python.org
Chris Rebert wrote:
> On Sat, Nov 14, 2009 at 3:25 PM, AON LAZIO <aonl...@gmail.com> wrote:
>> Hi, I have some problem with object reference
>> Say I have this code
>>
>> a = b = c = None
>> slist = [a,b,c]
>
> Values are stored in the list, not references to names.

That is not right either, or else newbies would not be surprised by
>>> a = [0]
>>> b = [a]
>>> b[0][0] = 1
>>> a
[1]

Subscriptable collections associate subscripts with objects.
Namespaces associated names with objects.
In either case, if you change the object, you change it, regardless of
how you access it, such as by means of other associations.
If you replace an association by associating a name or subscript with a
new object, the old object is untouched (unless that was its last
association) and other access methods by means of other associations are
not affected.

Terry Jan Reedy

Chris Rebert

unread,
Nov 14, 2009, 10:19:19 PM11/14/09
to Terry Reedy, pytho...@python.org

Okay, I should have technically said "references to objects" rather
than "values", but in any case, names themselves are certainly not
referenced or the following would print "[1]".

>>> a = [0]
>>> b = [a]

>>> a = [42]


>>> b[0][0] = 1
>>> a

[42]

0 new messages