I just started scripting on blender no long ago, even tho i have read the API about dependency graph I still have question in what's the difference between "instance_object" and object inside the depsgraph. 

Following code from template operator_modal_view3d_raycast.py

      def visible_objects_and_duplis():
        """Loop over (object, matrix) pairs (mesh only)"""

        depsgraph = context.evaluated_depsgraph_get()
        for dup in depsgraph.object_instances:
            if dup.is_instance:  # Real dupli instance
                obj = dup.instance_object
                yield (obj, dup.matrix_world.copy())
            else:  # Usual object
                obj = dup.object
                yield (obj, obj.matrix_world.copy())