Hi guys!
I am working on Conway's Game of Life right now and I've run into a
little problem.
I represent dead cells with 0s and live ones with 1s. Check this out:
>>grid = [[0] * 3] * 3 grid
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>grid[0][0] = 1
[[1, 0, 0], [1, 0, 0], [1, 0, 0]]
Now, that's not what I want. I just want the first element of the
first sublist to be a 1, not the first of every one. Here's what I
tried and didn't work:
0. grid = [[0] * 3][:] * 3 then the same grid[0][0] = 1 statement
1. grid = [[0][:] * 3] * 3 followed by the same assignment
2. (grid[0])[0] = 1 with the original initialization of the grid
So, that means that it isn't a problem with two different variables
refering to the same list (0. and 1. prove that). What I don't
understand is why 2. doesn't work either. I'm babyfeeding my
instructions to Python and the mistake is still there. Any ideas?
Hope you can help. Thanks in advance,
Pablo 5 1454
Classic

@salutations
Michel Claveau
On Sunday 19 August 2007, Pablo Torres wrote:
Hi guys!
I am working on Conway's Game of Life right now and I've run into a
little problem.
I represent dead cells with 0s and live ones with 1s. Check this out:
>>grid = [[0] * 3] * 3
>>grid
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>grid[0][0] = 1
[[1, 0, 0], [1, 0, 0], [1, 0, 0]]
Now, that's not what I want. I just want the first element of the
first sublist to be a 1, not the first of every one. Here's what I
tried and didn't work:
0. grid = [[0] * 3][:] * 3 then the same grid[0][0] = 1 statement
1. grid = [[0][:] * 3] * 3 followed by the same assignment
2. (grid[0])[0] = 1 with the original initialization of the grid
So, that means that it isn't a problem with two different variables
refering to the same list (0. and 1. prove that). What I don't
understand is why 2. doesn't work either. I'm babyfeeding my
instructions to Python and the mistake is still there. Any ideas?
If you want three copies of the list, you need to copy it thrice (well, twice)
Thus:
>>row = [0] * 3 grid = [] for n in xrange(3): grid.append(row[:])
...
>>grid
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>grid[0][0] =1 grid
[[1, 0, 0], [0, 0, 0], [0, 0, 0]]
>>>

Regards, Thomas Jollans
GPG key: 0xF421434B may be found on various keyservers, eg pgp.mit.edu
Hacker key <http://hackerkey.com/>:
v4sw6+8Yhw4/5ln3pr5Ock2ma2u7Lw2Nl7Di2e2t3/4TMb6HOPTen5/6g5OPa1XsMr9p7/6
BEGIN PGP SIGNATURE
Version: GnuPG v1.4.6 (GNU/Linux)
iD8DBQBGyMbtJpinDvQhQ0sRApTqAJ4m/bhLdNtr9XGjBhipvhYQ7T4H0gCfXmtW
/+c21FwvXIth2/oXpP48Afw=
=tbqy
END PGP SIGNATURE
Pablo Torres schreef:
Hi guys!
I am working on Conway's Game of Life right now and I've run into a
little problem.
I represent dead cells with 0s and live ones with 1s. Check this out:
>>grid = [[0] * 3] * 3
>>grid
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>grid[0][0] = 1
[[1, 0, 0], [1, 0, 0], [1, 0, 0]]
Now, that's not what I want. I just want the first element of the
first sublist to be a 1, not the first of every one. Here's what I
tried and didn't work:
0. grid = [[0] * 3][:] * 3 then the same grid[0][0] = 1 statement
1. grid = [[0][:] * 3] * 3 followed by the same assignment
2. (grid[0])[0] = 1 with the original initialization of the grid
So, that means that it isn't a problem with two different variables
refering to the same list (0. and 1. prove that). What I don't
understand is why 2. doesn't work either. I'm babyfeeding my
instructions to Python and the mistake is still there. Any ideas?
Hope you can help. Thanks in advance,
The multiplication operator doesn't make new copies; all elements
reference the same object, as you can see with id():
>>lst = [0] * 3 lst
[0, 0, 0]
>>id(lst[0]), id(lst[1]), id(lst[2])
(9788716, 9788716, 9788716)
As a consequence, if you modify one element, you change them all (since
it's all the same object). Solution: make sure to create independent lists.
>>grid = [[0] * 3 for i in range(3)] grid
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>grid[0][0] = 1

If I have been able to see further, it was only because I stood
on the shoulders of giants.  Isaac Newton
Roel Schroeven
Thanks everyone. Now I see why every row in my grid were actually the
same object.
Pablo
Roel Schroeven wrote:
Pablo Torres schreef:
>Hi guys!
I am working on Conway's Game of Life right now and I've run into a little problem. I represent dead cells with 0s and live ones with 1s. Check this out:
> >>grid = [[0] * 3] * 3 >>grid
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
> >>grid[0][0] = 1
[[1, 0, 0], [1, 0, 0], [1, 0, 0]]
Now, that's not what I want. I just want the first element of the first sublist to be a 1, not the first of every one. Here's what I tried and didn't work:
0. grid = [[0] * 3][:] * 3 then the same grid[0][0] = 1 statement 1. grid = [[0][:] * 3] * 3 followed by the same assignment 2. (grid[0])[0] = 1 with the original initialization of the grid
So, that means that it isn't a problem with two different variables refering to the same list (0. and 1. prove that). What I don't understand is why 2. doesn't work either. I'm babyfeeding my instructions to Python and the mistake is still there. Any ideas?
Hope you can help. Thanks in advance,
The multiplication operator doesn't make new copies; all elements
reference the same object, as you can see with id():
>>>lst = [0] * 3 lst
[0, 0, 0]
>>>id(lst[0]), id(lst[1]), id(lst[2])
(9788716, 9788716, 9788716)
I think you probably meant something like,
>>lst = [[0] * 3] * 3 lst
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>id(lst[0]), id(lst[1]), id(lst[2])
(15937704, 15937704, 15937704)
>>>
i.e. a list of mutable types where the difference between multiple
objects and multiple references to the same object will be apparent.
With small integers you're likely to find you have multiple references
to the same integer objects however the list is constructed.
Duncan This discussion thread is closed Replies have been disabled for this discussion. Similar topics
24 posts
views
Thread by Steven Bethard 
last post: by

1 post
views
Thread by Nils Grimsmo 
last post: by

19 posts
views
Thread by Nicolas Fleury 
last post: by

54 posts
views
Thread by Andy 
last post: by

9 posts
views
Thread by Ralf Hildebrandt 
last post: by

87 posts
views
Thread by Vijay Kumar R Zanvar 
last post: by

17 posts
views
Thread by Christopher Dyken 
last post: by

23 posts
views
Thread by mahesh 
last post: by
           