A powerful feature of Jupyter / IPython (indeed, of Python itself) is that you can interact with your data from the (I)Python command line. In order to provide this functionality, the modules which hold your data remain alive between invocations. Therefore once a module is imported, it stays imported, and re-importing it has no effect at all.
However this great feature can have puzzling consequences, especially to programmers who are more used to compiled languages with make-style dependency change detection. In particular, if you change a python module which has already been imported within ipython, and then re-import that module (e.g. by using ipython to run a program which uses it), python will think "I've already imported this module, no need to read that file again", so your changes will not be effective. (Note that this does not apply to your main program file, which IPython runs directly, rather than importing, so that changes are always effective once they are saved.)
There are several ways to work around this issue.
1) The simplest and most certain is to restart the ipython kernel after changing an imported module. But this has downsides as well, notably losing the data which exists in your ipython namespace and in any other imported modules.
2) For simple cases, you can use python's reload function. (This function is builtin in Python 2. Starting with Python 3.4, it is imported from standard module "importlib"). In many cases, this suffices after editing a module. It is described briefly in this discussion on Stack Overflow and elsewhere online in more detail.
3) For more complex cases, where reloading the module that you have edited also requires that its dependent/imported modules be reloaded (e.g. because they must be initialized as part of your edited module's initialization), ipython's autoreload extension can be useful. See http://ipython.readthedocs.org/en/stable/config/extensions/autoreload.html including the important caveats at the bottom of the page.