net.zero_grad() zeroes out grad attribute of every parameter in the net.

loss.backward() computes gradients of every parameter w.r.t loss tensor.

In order to see the gradient of a parameter, you can do print(net.conv1.bias.grad) instead of print(net.conv1.bias.backward).
backward as you see is a method and it is showing the actual parameters and not the gradients.
The fact that the parameters remain the same before and after backward() call is because you need to do optimizer.step() in order to update the parameters.