Почему я получаю дополнительное приращение в моем коде newb ie? - PullRequest
1 голос
/ 18 июня 2020

Новый кодер Python здесь, с приличным количеством c# опыта. Я пытаюсь выполнить это упражнение из раздела «Автоматизация скучной работы» с помощью Python:

Chess Dictionary Validator В этой главе мы использовали значение словаря {'1h': 'bking', '6 c ':' wqueen ',' 2g ':' bbishop ',' 5h ':' bqueen ',' 3e ':' wking '} для обозначения шахматной доски. Напишите функцию с именем isValidChessBoard (), которая принимает аргумент словаря и возвращает True или False в зависимости от того, действительна ли доска. На правильной доске будет ровно один черный король и ровно один белый король. У каждого игрока может быть не более 16 фигур, не более 8 пешек, и все фигуры должны находиться на допустимом поле от «1a» до «8h»; то есть кусок не может находиться в пространстве «9z». Названия фигур начинаются с буквы «w» или «b» для обозначения белых или черных, за которыми следуют «пешка», «конь», «слон», «ладья», «ферзь» или «король». Эта функция должна обнаруживать, когда ошибка привела к неправильной шахматной доске.

Мое текущее решение следующее: следующий код ...

print('Before Increment: ' + str(wPieces['king']) + ' white King(s), ' + str(bPieces['king']) + ' black King(s)')
                bPieces[board[k][1:]] += 1
                print('After Increment: ' + str(wPieces['king']) + ' white King(s), ' + str(bPieces['king']) + ' black King(s)')

... Я получаю прибавку к Черным Королям, как и ожидалось, но я также получаю приращение к Белым Королям. Я немного запутался. Есть ли какая-то глобальная переменная, которую мне здесь не хватает, или я просто пишу код gibberi sh?

Был бы очень признателен за вторую пару взглядов на эту. Заранее спасибо, Rev.

1 Ответ

1 голос
/ 18 июня 2020

Ошибка находится в следующей строке:

wPieces = bPieces = BOARDUNITS

Цель этого оператора - создать две копии словаря BOARDUNITS. Вместо этого в этой строке обе переменные wPieces и bPieces назначаются ссылке на один и тот же объект словаря. Таким образом, изменение записей wPieces также изменит bPieces, а также изменит BOARDUNITS, поскольку все три идентификатора указывают на один и тот же объект.

Вместо этого вы можете создать копию BOARDUNITS объект вроде так:

wPieces = BOARDUNITS.copy()
bPieces = BOARDUNITS.copy()
...