I am creating code that calculates neighbor coordinates to passed coordinate.
I have list of lists with “directions” I want move to, first number is X-value, second number is Y-value.
directions = [[0, 1], [0, -1], [1, 0], [-1, 0]]
Then I have a function to calculate new coordinates and store them in a list “results”
results = []
def NeighborsFinder(coordinate):
originalCoordinate = coordinate
for x in range(0, len(directions)):
coordinate[0] += directions[x][0]
coordinate[1] += directions[x][1]
results.append(coordinate)
print(coordinate)
coordinate = originalCoordinate
Example: if I pass coordinate [2, 3]
Then correct output should be list with coordinates: [2, 4] [2, 2], [3, 3], [1, 3]
Well but what happens to me is that its adding +1, but not substracting -1 so my output look like this: [2, 4], [2, 3], [3, 3], [2, 3].
Advertisement
Answer
Okay, so that code does not do what you intend it to do. Lists are mutable which means that
>>> coordinate = [2, 3]
>>> oldCoordinate = coordinate
>>> coordinate.append(5)
>>> coordinate
[2, 3, 5]
>>> oldCoordinate # oldCoordinate has changed too
[2, 3, 5]
an option would be to use copy
>>> coordinate = [2, 3]
>>> oldCoordinate = coordinate.copy()
>>> coordinate.append(5)
>>> coordinate
[2, 3, 5]
>>> oldCoordinate
[2, 3]
but even with that, there are things to change here cause your code is hard to reason about, it would be better to do that
def NeighborsFinder(coordinate, directions):
newCoordinates = []
for x, y in directions:
newCoordinates.append([coordinate[0] + x, coordinate[1] + y])
print(newCoordinates)
it’s shorter, more beautiful and way easier to reason about
EDIT: But it can be even better actually, it can be a clear one liner
def neighbors_finder(coordinate, directions):
return [[x + coordinate[0], y + coordinate[0]] for x, y in directions]