As soon as you load this module your heavy_function() gets loaded and store it's value into _data and this _data gets stored in globals(). And then it doesn't matter how many time you use that same object gets passed over.
For your understanding here I'm simultaing the function value just by giving a list [1, 2, 3], here I'm checking the object identity by comparing foo() return value with _data and refcount to show that it not getting referenced more than once.
#import heavy_function
import sys
_data = [1, 2, 3] # heavy_function()
def foo():
    print _data
def bar():
    print 'Call no 1'
    value1 = foo()
    print sys.getrefcount(_data)
    print 'Call no 2'
    value2 = foo()
    print sys.getrefcount(_data)
    print 'call no 3'
    value3 = foo()
    print sys.getrefcount(_data)
    print 'Check referenced values..'
    print value1 is value2 
bar()
Output:
Call no 1
[1, 2, 3]
2
Call no 2
[1, 2, 3]
2
call no 3
[1, 2, 3]
2
Check referenced values..
True
Here if you see even after the third call the same object is getting returned from foo and this print value1 is value2 one helps you to identify that.
     
    
_data = heavy_function()is executed the return value is stored in the variable and hence every time you use the variable the stored value is displayed_datais a name that points to the return value of the function, you assign it once so the function is called once