python ошибочная ссылка на список - PullRequest
0 голосов
/ 08 мая 2020

Привет, сообщество,

        SourcePoints = self.SourcePoints
        TargetPoints = self.TargetPoints

        print("SourcePoints: ", self.SourcePoints)
        print("TargetPoints: ", self.TargetPoints)

        for point in SourcePoints:
            for i in range(len(point)):
                point[i] = Origin[i] + point[i] * Spacing[i]
        for point in TargetPoints:
            for i in range(len(point)):
                point[i] = Origin[i] + point[i] * Spacing[i]

        print("SourcePoints: ", self.SourcePoints)
        print("TargetPoints: ", self.TargetPoints)

Что вам, вероятно, нужно знать для контекста: - self.SourcePoints / self.TargetPoints инициализируется после создания экземпляра класса (наследующего код). Нет другого раздела, где можно манипулировать списками. - self.SourcePoints / self.TargetPoints - это списки списков - вырезанный код является частью функции внутри класса

Я далеко не эксперт в программировании, поэтому я могу наблюдать здесь кое-что очевидное, но я Я не могу его увидеть, и это сводит меня с ума, потому что две команды печати не имеют одинаковых результатов ... и сценарий вылетает (из c), потому что self.SourcePoints / self.TargetPoints "неправильные" в следующей итерации.

Итак, теперь вы можете сказать, что, написав

        SourcePoints = self.SourcePoints

, вы не делаете копию, а создаете ссылку на список, поэтому естественно исходный список изменяется во время циклов for. Для меня это имеет смысл, поэтому я попробовал

        SourcePoints = copy.copy(self.SourcePoints)

и

        SourcePoints = self.SourcePoints.copy()

, которые ничего не изменили.

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

        srcPoints = self.SourcePoints.copy()

И это все еще не работает ... Я действительно понятия не имею, что происходит, и это сводит меня с ума. К счастью, у меня есть обход для сценария, но я все еще пытаюсь понять, почему это происходит. Мне совершенно не понятно, почему две команды печати не имеют идентичного вывода. Тем не менее, компьютер просто делает то, что я ему говорю.

Может кто-нибудь просветить меня?

Привет, Пустота

1 Ответ

0 голосов
/ 08 мая 2020

Вы создаете мелкие копии переменной экземпляра. Чтобы получить полностью независимую копию объекта, вы можете использовать функцию copy.deepcopy().

Попробуйте внести следующие изменения в свои первые 2 строки

import copy
SourcePoints = copy.deepcopy(self.SourcePoints)
TargetPoints = copy.deepcopy(self.TargetPoints)

Возможно, этот пост будет полезен для дополнительная информация о мелком и глубоком копировании - Что такое dict.copy () - мелкое или глубокое?

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