bpy.data.object 'NurbsPath' name is "NurbsPath.001" and cannot be "NurbsPath" while bpy.data.curves name can be either "NurbsPath" or "NurbsPath.001"
Some blender basics.

bpy.data.objects is a collection of objects of type bpy.types.Object, as is context.selected_objects and context.scene.objects.  The properties and methods of bpy.types.Object are available to all objects of any type.

Each object has a data part. When an object is created its type is set according to its data.  This cannot be changed, eg trying to give a 'CURVE' type object a 'MESH type data will result in an error. 

Each object has only one data member.

&gt;&gt;&gt; for ob in C.selected_objects:
...     ob.name, ob.type, ob.data, type(ob.data)
...     
('Empty', 'EMPTY', None, &lt;class 'NoneType'&gt;)
('BezierCurve', 'CURVE', bpy.data.curves['BezierCurve'], &lt;class 'bpy.types.Curve'&gt;)
('Cube', 'MESH', bpy.data.meshes['Cube'], &lt;class 'bpy_types.Mesh'&gt;)


for example the curve type object above has one data member of type bpy.types.Curve.  All curve type objects in the file will be in the bpy.data.curves collection.  The curve object is not equivalent to the curve data object.

&gt;&gt;&gt; D.objects['BezierCurve'] is D.curves['BezierCurve']
False


but rather the data part of the object.

&gt;&gt;&gt; D.objects['BezierCurve'].data is D.curves['BezierCurve']
True


Can set the data to any other data of the same type.

&gt;&gt;&gt; C.object.data
bpy.data.curves['BezierCurve']

&gt;&gt;&gt; C.object.data = D.curves['BezierCurve.001']
&gt;&gt;&gt; C.object.data
bpy.data.curves['BezierCurve.001']


Each data type, can be used by none or many objects.  There is no direct reference from a data object to its object. To find all the objects that use the "BezierCurve" data in a scene would  use something like 

&gt;&gt;&gt; [o for o in C.scene.objects if o.data is D.curves['BezierCurve']]
[bpy.data.objects['BezierCurve']]