Я работал над проектом для класса, где мой код не выдавал те же результаты, что и ссылочный код.
Я сравнил свой код с ссылочным кодом по строкам, они появились почти точно так же. Все казалось логически эквивалентным. В конце концов я начал заменять строки и тестирование, пока не нашел нужную строку.
Оказалось, что это что-то вроде этого (EDIT: точный код ниже):
# my version:
max_q = max([x for x in self.getQValues(state)])
# reference version which worked:
max_q = max(x for x in self.getQValues(state))
Теперь это меня озадачило. Я попробовал несколько экспериментов с интерпретатором Python (2.7), выполнив тесты с использованием max
в списках с квадратными скобками и без них. Результаты оказались точно такими же.
Даже путем отладки через PyCharm я не мог найти причин, по которым моя версия не привела к тому же результату, что и эталонная версия. До этого момента я подумал, что у меня неплохой инструмент управления работой списков (и как работает функция max()
), но теперь я не уверен, потому что это такое странное несоответствие.
Что здесь происходит? Почему мой код производит разные результаты, чем код ссылки (в версии 2.7)? Как переход в понимании без скобок отличается от перехода в понимании с помощью скобок?
EDIT 2: точный код:
# works
max_q = max(self.getQValue(nextState, action) for action in legal_actions)
# doesn't work (i.e., provides different results)
max_q = max([self.getQValue(nextState, action) for action in legal_actions])
Я не думаю, что это должно быть помечено как дублирующее - да, другой вопрос касается разницы между объектами понимания и объектами списка, но не почему max()
будет давать разные результаты при задании "некоторого списка, построенного по X понимание, а не только" понимание Х".