Это работает, как ожидалось. Module.parameters()
возвращает итератор, точнее, генератор Python. Одна вещь о них заключается в том, что вы не можете перематывать генератор. Итак, при первом list(d)
вызове вы фактически «потребляете» весь генератор. Затем, если вы попытаетесь сделать это снова, оно будет пустым.
Если вам интересно, реализацию .parameters()
можно увидеть здесь , и это очень просто:
def parameters(self, recurse=True):
for name, param in self.named_parameters(recurse=recurse):
yield param
Возможно, легче обернуть это вокруг этим примером игрушки:
def g():
for x in [0, 1, 2, 3, 4]:
yield x
d = g()
print(list(d)) # prints: [0, 1, 2, 3, 4]
print(list(d)) # prints: []