Остановить функцию от изменения исходного списка - PullRequest
1 голос
/ 02 марта 2020

я делаю бин go игра с испытаниями с использованием pygame ... дело в том, что у меня есть функция "challengeGeneretor" и оригинальный список задач с длиной 35 предметов, и после использования этой функции он удаляется из оригинала вместо этого список из списка, который я сделал в функции (я пробовал без ранее), и это делает ошибку, когда я пытаюсь сгенерировать новые случайные вызовы для корзины go. (работает при первом генерировании)

здесь есть функция:

    def challengesGeneretor(self, challenges, board):
        challenges1 = challenges
        for n, i in enumerate(board):
            for j in range(len(i)):
                x = random.randint(0, len(challenges1) - 1)
                board[n][j] = challenges1[x]
                challenges1.remove(challenges1[x])
        challenges1 = challenges      # just me trying things
        return board

и функция событий ... не знаю, если это часть проблемы

    def playing_events(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                self.running = False
            if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
                selected = self.mouseOnGrid()
                buttonClick = self.mouseOnButton()
                if selected:
                    self.selected.add(selected)
                if buttonClick:
                    self.selected = set()
                    self.grid = testboard     # "testboard" = empty board
                    self.grid = self.challengesGeneretor(challenges, testboard)

здесь ошибка:

Traceback (most recent call last):
  File "/main.py", line 5, in <module>
    app.run()
  File "\app_class.py", line 25, in run
    self.playing_events()
  File "\pygames\app_class.py", line 47, in playing_events
    self.grid = self.challengesGeneretor(challenges, testboard)
  File "\app_class.py", line 146, in challengesGeneretor
    x = random.randint(0, len(challenges1) - 1)
  File "\random.py", line 222, in randint
    return self.randrange(a, b+1)
  File "\random.py", line 200, in randrange
    raise ValueError("empty range for randrange() (%d,%d, %d)" % (istart, istop, width))
ValueError: empty range for randrange() (0,0, 0)

Любая помощь будет СУПЕР признательна, спасибо!

Ответы [ 2 ]

3 голосов
/ 02 марта 2020

challenges1 = challenges не создает новый массив в памяти, он передает адрес памяти новой переменной (проверьте указатели). Это работает так со сложными структурами данных, такими как массивы.

Если вам нужна копия исходного списка, создайте функцию, которая создает пустой список, и скопируйте элементы исходного списка во вновь созданный.

3 голосов
/ 02 марта 2020

Я думаю, вам нужно понять принцип мелкого копирования. ref

И вы, возможно, захотите спросить себя, действительно ли вы хотите работать с копией, поскольку, когда список становится большим, производительность может быть проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...