Not being able to copy/paste your script, I'll not rewrite it all here. But here are some additions I'd make, to "reselect" your initial object.
I would first have an obj that references your initial selected object, and then after each duplication, have the script select that object again (instead of the duplicate object automatically selected). So before the loop I'd add:
objOrig =bpy.context.selected_objects[0]
so you save it for future reference, and then after the duplicate_move
statement inside the loop I'd add the two statements:
bpy.ops.object.select_all( action='DESELECT' ) # Deselect all objects
objOrig.select_set(True) # reselect the original object
Example:
import bpy
obj1=bpy.context.selected_objects[0]
newx=1
for i in range(1,10):
bpy.ops.object.duplicate_move(OBJECT_OT_duplicate={"linked":False, "mode":'TRANSLATION'},
TRANSFORM_OT_translate={"value":(newx, 1, 1), "orient_axis_ortho":'X', "orient_type":'GLOBAL',
"orient_matrix":((1, 0, 0), (0, 1, 0), (0, 0, 1)), "orient_matrix_type":'GLOBAL',
"constraint_axis":(False, False, False), "mirror":False, "use_proportional_edit":False, "proportional_edit_falloff":'SMOOTH',
"proportional_size":1, "use_proportional_connected":False, "use_proportional_projected":False, "snap":False, "snap_target":'CLOSEST',
"snap_point":(0, 0, 0), "snap_align":False, "snap_normal":(0, 0, 0), "gpencil_strokes":False, "cursor_transform":False,
"texture_space":False, "remove_on_cancel":False, "view2d_edge_pan":False, "release_confirm":False, "use_accurate":False,
"use_automerge_and_split":False})
bpy.ops.object.select_all( action='DESELECT' ) # Deselect all objects
obj1.select_set(True)
newx+=1