I don't think unit.path.path is recalculated every tick. That would be WAAAY too much a drain on performance, and completely unnecessary -- unit.path.path would be recalculated only when the unit is either waiting on a new job or has encountered some kind of obstacle in the way of his current path that wasn't there before (like a locked door.) That is, if a unit tries to move into a new tile according to his path and finds that he can't, his path is recalculated, but ONLY then. This makes it much easier to override default pathfinding, as well.
Also, I can't remember the details of it, but each "block" (16x16 area on 1 z-level) has its own internal connection graph, and the whole map has a connection graph between individual blocks, as a sort of performance measure (first the game checks if there is a path using the higher-level connection graph between blocks, and if there is, it tries to resolve it in a more detailed way using the blocks' connection graphs. If it doesn't find a path using the higher-level graph, it already knows there's no path at all, and saves time by not having to go into the more detailed connection graphs.) Burning objects and enemies are not factored into pathfinding at all -- pathfinding simply determines whether it would technically be possible for the dwarf to go from A to B. For that reason, however, water of depth 4 and magma of depth 1 do, in fact, count as blockages.
unit.path.path is just a list of adjacent tile positions, separated into three vectors, x, y, and z. The x coordinates of the positions are placed in x in order, the y coordinates in y in order, and the z coordinates in z in order. unit.path.path does indeed describe a contiguous sequence of coordinates.