Difference between instance object and object in dependency graph
The difference between a copied object and an instance is that the copied object is a separate entity that can have its properties, materials, modifiers etc. adjusted without affecting the object it was copied from. Instances of an object are practically identical except for their location, scale and rotation. Changes to the object affect all instances of it. For example a particle system that uses Render As: Object creates instances of an object for every generated particle.

The following ways exist to create instances of objects:


Particles based on objects
Creating collection instances
Instancing of a child object at vertices of the parent
Instancing of a child object at faces of the parent


You can test this yourself by running the following script in the Scripting workspace. It will print the instances and objects that are present in the scene.

import bpy

depsgraph = bpy.context.evaluated_depsgraph_get()
for dup in depsgraph.object_instances:
    if dup.is_instance:  # Real dupli instance
        obj = dup.instance_object
        print(f"Instance: {obj.name}")
    else:  # Usual object
        obj = dup.object
        print(f"Object: {obj.name}")
print("---") 


More information about this topic can be found in the manual.