you're setting the new knight's "sl" to the value self.sl and then adding
values to it.  that's the same list - so you are adding values to the
self.sl list when you add them to the knight's sl.

this is easier to understand just by seeing the fix, which is to use:

temp = Knight(self.x, self.y, self.g, self.h, self.gp, list(self.sl))

which will make a new copy of the list, so you are only adding to the sl
in the (new) knight.

andrew



dlocpuwons wrote:
> Using Python 2.6.1...
>
> I am (attempting) to make an A* search for a chess problem, but I am
> running into a really annoying shared memory issue in my successor
> function. Here it is stripped down to the important parts that relate
> to my problem.
>
> def successors(self):
>               result = []
>               moves = [[2, 1], [2, -1], [-2, 1], [-2, -1], [1, 2], [1, -2], 
> [-1,
> 2], [-1, -2]] #possible moves for a knight
>
>               for i in moves:
>                       temp = Knight(self.x, self.y, self.g, self.h, self.gp, 
> self.sl)
>                       temp.x += i[0]
>                       temp.y += i[1]
>                       temp.sl.append([temp.x, temp.y]) #Adds the new current 
> state to the
> visited states list
>                       result.append(temp)
>               return result
>
> The method creates a temporary Knight object, increments it to the new
> position and then adds this new position to its list of visited
> states. Then it returns a list of these 8 new objects. The problem
> seems to be with the "result.sl.append()" line. As the method chugs
> along and creates the new objects the "temp.sl" lines seems to stay in
> memory, so when the method is done all the new objects have all the
> new states that were made over the course of the method instead of
> just their own created in the loop. For example when I try to get
> successors for a piece that is initially at (2,2) with no previously
> visited states, the method prints this out for the sl (state list)
> value
>
> [[2, 2], [4, 3], [4, 1], [0, 3], [0, 1], [3, 4], [3, 0], [1, 4], [1,
> 0]]
> [[2, 2], [4, 3], [4, 1], [0, 3], [0, 1], [3, 4], [3, 0], [1, 4], [1,
> 0]]
> [[2, 2], [4, 3], [4, 1], [0, 3], [0, 1], [3, 4], [3, 0], [1, 4], [1,
> 0]]
> [[2, 2], [4, 3], [4, 1], [0, 3], [0, 1], [3, 4], [3, 0], [1, 4], [1,
> 0]]
> [[2, 2], [4, 3], [4, 1], [0, 3], [0, 1], [3, 4], [3, 0], [1, 4], [1,
> 0]]
> [[2, 2], [4, 3], [4, 1], [0, 3], [0, 1], [3, 4], [3, 0], [1, 4], [1,
> 0]]
> [[2, 2], [4, 3], [4, 1], [0, 3], [0, 1], [3, 4], [3, 0], [1, 4], [1,
> 0]]
> [[2, 2], [4, 3], [4, 1], [0, 3], [0, 1], [3, 4], [3, 0], [1, 4], [1,
> 0]]
>
> but what it should print out is
>
> [[2, 2], [4, 3]]
> [[2, 2], [4, 1]]
> [[2, 2], [0, 3]]
> [[2, 2], [0, 1]]
> [[2, 2], [3, 4]]
> [[2, 2], [3, 0]]
> [[2, 2], [1, 4]]
> [[2, 2], [1, 0]]
>
> It sort of seems like python is trying to be too smart and is trying
> to keep things in memory. Is there anyway to work around this?
> --
> http://mail.python.org/mailman/listinfo/python-list
>
>


--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to