There are three states of an image in Blender: the input state, the reference state, and the output state. While the internal reference space is always a linearized model, the input and output states are variable.
In this case, if you take a typical JPEG and open it in Blender, the default transfer curve that is assumed is sRGB. That is, it takes the canonized specification of sRGB's transfer curve and inverts it and bends the colours of your JPEG accordingly. This results in, as best as a JPEG can deliver (which is not very good) a radiometrically linear version of the RGB representation. Why? In order to compose and blend colours correctly, colours must be expressed relative to their radiometrically correct luminance. If not, colours will result in very strange blending.
So now we know why, what happens when things come out of Blender?
This is all handled via OpenColorIO, and as such, you will need to make sure that your output format handles things correctly. If you are dealing with this via Python, the correct approach is to apply a transformation on the RGB data to whatever output transformation you require. In most instances, you will want to transform from the internal reference linear space to sRGB, which will apply the correct intensity transfer curve to get the RGB back into that typical JPEG intensity curve you began with.
If you are generating files out of Blender, much of this is handled automatically. PNG, JPEG, TIFF, etc. will all perform the sRGB transformation out of the reference space. EXR, however, being a strictly linear storage medium, will leave it in linear, whatever colour space it happened to be in within the reference space.