In geom3d the points (and other objects) are implemented
as names with associated properties (attributes).
In the first part you re-use the same name (A) three times.
Of course, only the last definition survives.
The second part is equivalent to
for i from 1 to nops(data) do
P[i]:='point'(A, data[i][2 .. 4]);
end do;
for i from 1 to nops(data) do print(i,form(P[i]),coordinates(P[i]));
end do;
Now, P[i] (and also A) is redefined each time it is used.
This is not efficient and in geom3d only a single point (name), A, is
defined.
Probably you will have big problems later using P[i] with other
functions.
The correct solution would be to define the points P1,P2,... using
for i from 1 to nops(data) do
point(P||i, data[i][2 .. 4]) end do;
Now,
for i from 1 to nops(data) do print(i,form(P||i),coordinates(P||i));
end do;
works ok.
Mate