<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def notify_changes(self, changes):
 # type: (List[List]) -> CallbackResponses """Set our data and notify anyone listening Args: changes (list):
 [[path, optional data]] where path is the path to what has changed, and data is the unserialized object that has changed Returns: list: [(callback, Response)] that need to be called """

        ret = []
        child_changes = {}
        for change in changes:
            # Add any changes that our children need to know about
            self._add_child_change(change, child_changes)

        # If we have update subscribers, serialize at this level
        if self.update_requests:
            serialized = serialize_object(self.data)
            for request in self.update_requests:
                ret.append(request.update_response(serialized))

        # If we have delta subscribers, serialize the changes
        if self.delta_requests:
            for change in changes:
                change[-1] = serialize_object(change[-1])
            for request in self.delta_requests:
                ret.append(request.delta_response(changes))

        # Now notify our children
        for name, child_changes in child_changes.items():
            ret += self.children[name].notify_changes(child_changes)
        return ret