When ranges are given without explicit variables, the plotting routine creates a list of function arguments in alphabetical order of variable names, and the ranges are then assigned in the same order. You can (and probably should) override this automatic behavior by always specifying names: contour_plot(f,(k1,0,2),(k2,3,5)) will then differ from contour_plot(f,(k2,0,2),(k1,3,5)) as expected.
The missing error with plot occurs because the routine sets a flag expect_one_var=True. This is meant to be a convenience that makes plotting in one dimension a bit easier by suppressing a different error message. Unfortunately it creates the confusion you've noticed.
When ranges are given without explicit variables, the plotting routine creates a list of function arguments in alphabetical order of variable names, and the ranges are then assigned in the same order. You can (and probably should) override this automatic behavior by always specifying names: contour_plot(f,(k1,0,2),(k2,3,5)) will then differ from contour_plot(f,(k2,0,2),(k1,3,5)) as expected.
The missing error with plot occurs because the routine sets a flag expect_one_var=True. This is meant to be a convenience that makes plotting in one dimension a bit easier by suppressing a different error message. Unfortunately it creates the confusion you've noticed.