Am I checking for equality in the wrong way? Or am I approaching the problem in the wrong way?
I'm not sure if this is the Right Way of doing things, but I got around this in my own application by making my Copyable objects have a unique ID. Keep your objects in a dict that maps from id -> object, and then just say something like:
objDict[obj.objID] = obj
whenever you get an object back. Possibly you want to check to see if the object is already in the dict, depending on your application-level constraints -- in my particular application, it would be considered an error to send back an object with an ID that wasn't already known by the server. (Also, you may or may not want to set __eq__, __lt__, etc. to compare these objects by their ID.)