Целое число Python, отказывающееся от увеличения (+ =) во время отладки - PullRequest
0 голосов
/ 28 мая 2018

Я отлаживаю сложную программу на Python (отладчик VSCode Python), и я замечаю очень странное поведение:

> type(self.i)
<class 'int'>
> self.i
1
> self.i+1
2
> self.i += 1
None
> self.i
1
> self.i = self.i + 1
None
> self.i
1

Переменная self.i просто полностью отказывается от приращения.Я выделил сеанс отладки, но даже без какой-либо точки останова, если выполнение находится внутри сеанса отладки, цикл, который должен занять 5 итераций, занимает случайное, более длинное число итераций.Такое поведение происходит:

  • только тогда, когда некоторый внешний код изменен особым образом
  • только при использовании отладчика.Простое выполнение скрипта через python устраняет проблему

Контекст заключается в том, что мы находимся внутри __next__ метода итератора, фрагмент кода

def __next__(self):
    if self.i < self.num_samples:
        i = self.i
        self.i += 1 # <- here is a breakpoint
        ....

Кодэто переключает поведение внутри цикла for, используя экземпляр указанного итератора.На самом деле не должно быть никакой связи между этим и тем, что происходит внутри итератора, но когда вычислительно дорогая строка, включающая обратное распространение pytorch, декомпозируется, возникает проблема.

Это озадачивает меня, потому что это так загадочно.Я не могу понять, почему переменная должна отказываться от приращения, есть ли ошибка, и если да, то где она находится (в отладчике VSCode, в моем коде, в Python, в PyTorch, ...?).Поэтому я был бы очень признателен, если бы кто-то смог пролить немного света на проблему

РЕДАКТИРОВАТЬ:

Класс, где это происходит, называется SpectraDataLoader и является итератором.Единственные ссылки на i находятся в __iter__ и __next__ (показано ранее):

def __iter__(self):
    ...
    self.i = 0
    ...
    return self
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...