Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > beginner question about range with list and list

Reply
Thread Tools

beginner question about range with list and list

 
 
erik gartz
Guest
Posts: n/a
 
      11-24-2006
Hello,
I'm new to python and I'm having difficulty understanding the following
code. Why doesn't the variable a contain [[{}, {'x': 0}, {}], [{},
{'x': 1}, {}]] instead. Doesn't {} allocate new memory for the
dictionary each time? It almost appears as if the 2nd dictionary
created overwrites the first one. Thanks for your help,
Erik

>>>
>>> a = [[{}] * 3] * 2
>>> a

[[{}, {}, {}], [{}, {}, {}]]
>>> for i in range(2):

a[i][1] = {'x':i}
>>> a

[[{}, {'x': 1}, {}], [{}, {'x': 1}, {}]]
>>>


 
Reply With Quote
 
 
 
 
Ben Finney
Guest
Posts: n/a
 
      11-24-2006
"erik gartz" <(E-Mail Removed)> writes:

> Doesn't {} allocate new memory for the dictionary each time? It
> almost appears as if the 2nd dictionary created overwrites the first
> one.


<URL:http://effbot.org/pyfaq/how-do-i-create-a-multidimensional-list.htm>

--
\ "There are only two ways to live your life. One is as though |
`\ nothing is a miracle. The other is as if everything is." -- |
_o__) Albert Einstein |
Ben Finney

 
Reply With Quote
 
 
 
 
Dan Lenski
Guest
Posts: n/a
 
      11-24-2006
erik gartz wrote:
> Doesn't {} allocate new memory for the
> dictionary each time? It almost appears as if the 2nd dictionary
> created overwrites the first one. Thanks for your help,
> Erik
>
> >>>
> >>> a = [[{}] * 3] * 2
> >>> a

> [[{}, {}, {}], [{}, {}, {}]]
> >>> for i in range(2):

> a[i][1] = {'x':i}
> >>> a

> [[{}, {'x': 1}, {}], [{}, {'x': 1}, {}]]
> >>>


You're right about both parts... sort of

Each time that {} is EVALUATED, it allocates a brand new dictionary.
However you're using the list repetition operator (* n). This operator
evaluates the list ONLY ONCE and then repeats that list n times.

The expression [{}]*3 will generate a list that contains the SAME
dictionary 3 times in a row. The expression [[{}]*3]*2 will generate a
list that contains the SAME list twice in a row. Thus, when you assign
to a[i][1], you are modifying a[0][1] and a[1][1], since a[0] and a[1]
are the same list.

The expression {'x':i} does indeed create a new dictionary each time it
is evaluated... however it gets assigned to the SAME list element each
time.

This is a fairly subtle point... if you want to make a new COPY of a
list (or other mutable object) rather than simply a new reference to
eat, you say a=b.copy() rather than just a=b. The ability to have
multiple references to one object is general considered a feature in
most programming languages, once you get used to it!

If you want to generate a 2x3 array with each element a DISTINCT
dictionary belonging to a DISTINCT list, try this:

a = [[{} for j in range(3)] for i in range(2)]
for i in range(2):
for j in range(3):
a[i][j] = {'row': i, 'column': j}

Dan

 
Reply With Quote
 
Fredrik Lundh
Guest
Posts: n/a
 
      11-24-2006
erik gartz wrote:

> I'm new to python and I'm having difficulty understanding the following
> code. Why doesn't the variable a contain [[{}, {'x': 0}, {}], [{},
> {'x': 1}, {}]] instead. Doesn't {} allocate new memory for the
> dictionary each time?


each time it's *executed*, yes. [{}]*3 doesn't execute [] or {} three
times; it executes them both once, and then creates a new list with
three references to the dictionary. see:

http://effbot.org/pyfaq/how-do-i-cre...ional-list.htm

</F>

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
How can I transform source range to destination range that is thesame as source? Lambda C++ 2 07-16-2008 05:18 PM
range() is not the best way to check range? Summercoolness@gmail.com Python 46 07-25-2006 08:10 PM
Scene range vs dynamic range Robert Feinman Digital Photography 2 07-04-2005 09:30 PM
No Class at ALL!!! beginner/beginner question =?Utf-8?B?S3VydCBTY2hyb2VkZXI=?= ASP .Net 7 02-03-2005 02:47 PM
Range does not take an Range object. Tomoyuki Kosimizu Ruby 3 11-27-2003 12:42 AM



Advertisments