That is an explanation but not a solution 
I don’t think this behaviour is correct, if I change the parent class to object instead of nn.Module, or the nn.ModuleList to python list(), then it will work as expected - but then it won’t work with DataParallel. As then it won’t replicate the model properly across multiple GPUs and I will end up with the dreaded tensors/parameters on different GPUs error…
It isn’t just print, (which I could avoid by not calling it), pretty much everything ends up in an infinite loop, eg  module.apply(fn)  which I can’t avoid using.