更改列表列表中的列表会将其他所有列表都更改为相同的值

时间:2020-10-26 20:32:17

标签: python class nested-lists

我是新来的,正在寻找建议。

我正在通过实现自己制作的游戏来学习如何使用Python(3.8)。我看到的每个新主题,都会或多或少从头开始,以介绍和实践我学到的新元素。我目前正试图摆脱班级的束缚。

我在使用“列表”时遇到了这个问题,但是:我想要一个“类”来创建编号的对象。为此,我创建了一个空白列表(players_vector = []),并使用“ for”循环将新对象附加到该列表。因此,我可以通过它们在该列表上的索引访问每个对象:例如players_vector[i].player_color

我无法理解的问题:

player_vector[i].pawn_coordinates是一个类似于[[x1,y1], [x2, y2]]的列表#有两个Pawn。

每次我尝试为其中一位玩家(例如:players_vector[2].pawn_coordinates[0] = [new_x, new_y])更改其中一位时,所有其他玩家也将相同的pawn坐标也更改为相同的值。 (player_color等其他属性也可以正常工作)

重现问题的一段代码:

import pyinputplus as pyip

WIDTH = 5
HEIGHT = 5
players_vector = []

class Player:
    def __init__(
        self,
        player_color=None,
        pawn_position=[-1, -1],
        pawn_coordinates=[[-1, -1], [-1, -1]],
        pawn_previous_position=[-1, -1]
    ):
        self.player_color = player_color
        self.pawn_position = pawn_position
        self.pawn_coordinates = pawn_coordinates
        self.pawn_previous_position = pawn_previous_position
        self.player_score = 0

    def return_position(self, WIDTH, pawn_index):
        return WIDTH*(self.pawn_coordinates[pawn_index][1]-1)+(self.pawn_coordinates[pawn_index][0]-1)

players_vector.append(Player('Brown'))
players_vector.append(Player('Orange'))
players_vector.append(Player('White'))

def place_pawns(WIDTH, players_vector):
        print(
            f"Player {players_vector[1].player_color}, please enter the starting coordinates for your Pawns:"
        )
        x = pyip.inputNum(f"Enter X (1-5) for your 1st Pawn: ", min=1, max=5)
        y = pyip.inputNum(f"Enter Y (1-5) for your 1st Pawn: ", min=1, max=5)
        players_vector[1].pawn_previous_position[0] = players_vector[1].pawn_position[0]
        players_vector[1].pawn_coordinates[0] = [x, y]
        players_vector[1].pawn_position[0] = players_vector[1].return_position(WIDTH, 0)
        x = pyip.inputNum(f"Enter X (1-5) for your 2nd Pawn: ", min=1, max=5)
        y = pyip.inputNum(f"Enter Y (1-5) for your 2nd Pawn: ", min=1, max=5)
        players_vector[1].pawn_previous_position[1] = players_vector[1].pawn_position[1]
        players_vector[1].pawn_coordinates[1] = [x, y]
        players_vector[1].pawn_position[1] = players_vector[1].return_position(WIDTH, 1)

place_pawns(WIDTH, players_vector) 

print(f'Coordinates: {players_vector[0].pawn_coordinates} Color: {players_vector[0].player_color}')
print(f'Coordinates: {players_vector[1].pawn_coordinates} Color: {players_vector[1].player_color}')
print(f'Coordinates: {players_vector[2].pawn_coordinates} Color: {players_vector[2].player_color}')

print('Then trying to change the first [x,y] of White to [3,2] and the Orange color to Green')
players_vector[2].pawn_coordinates[0] = [3,2]
players_vector[1].player_color = 'Green'

print(f'Coordinates: {players_vector[0].pawn_coordinates} Color: {players_vector[0].player_color}')
print(f'Coordinates: {players_vector[1].pawn_coordinates} Color: {players_vector[1].player_color}')
print(f'Coordinates: {players_vector[2].pawn_coordinates} Color: {players_vector[2].player_color}')

0 个答案:

没有答案
相关问题