on a leaf variable and .data is way to be a non-leaf variable.

It would still be a leaf variable, but as far a I understand, .data would allow you to workaround the fact that it is a leaf variable and would allow an in-place modification during a forward pass nonetheless, which can be dangerous (since users may be unaware that in certain cases that this would lead to “unintended” gradient computations).

Is there special reason for stricter blocking in case of the leaf variable?
I read that in-place operations are discouraged but not clear which of two is relevant with the leaf variable case.

Have a look at the “What about .data?” section in the PyTorch 0.4 migration guide: https://pytorch.org/2018/04/22/0_4_0-migration-guide.html 181