Actually yes, this code is necessary because the defaultdict will actually get created (as empty) if no entry exists which will later step-on self.item[field_name] data later in load_item() as described in comment [11469555](https://github.com/scrapy/scrapy/pull/208#issuecomment-11469555):

> This is because get_output_value() calls proc(self._values[field_name]) and since self._values is a defaultdict, self._values[field_name] gets created, which then overwrites the self.item[field_name] data later in load_item().