This answer shows how you can determine that converting 1/10 to floating-point and multiplying by 10 will produce exactly 1 using just a little arithmetic; there is no need to calculate large or precise numbers.
Your Python implementation uses the common IEEE-754 binary64 format. (Python is not strict about which floating-point format implementations should use.) In this format, numbers are represented, in effect, as a sign (+ or −) applied to some 53-bit integer multiplied by some power of two. Because 2−4 ≤ 1/10 < 2−3, the representable number nearest 1/10 is some integer M multiplied by 2−3−53. (The −53 scales the 53-bit integer to between ½ and 1, and the −3 scales that to between 2−4 and 2−3.) Let’s call that representable number x.
Then we have x = M•2−56 = 1/10 + e, where e is some rounding error that occurs when we round 1/10 to the nearest representable value. Since we round to the nearest representable value, |e| ≤ ½•2−56 = 2−57.
To find exactly what e is, multiply 1/10 by 256. WolframAlpha tells us it is 7205759403792793+3/5. To get the nearest representable value, we should round up, so M = 7205759403792794 and e = 2/5 • 2−56. Although I used WolframAlpha to illustrate this, we do not need M, and we can find e by observing the pattern in powers of two modulo 10: 21→2, 22→4, 23→8, 24→6, 25→2, 26→4, and so the pattern repeats with a cycle of 4, and 56 modulo 4 is 0, so 256 modulo 10 has the same remainder as 24, 6, so the fraction is 6/10 = 3/5. We know that should round to the nearest integer, 1, so e = 2/5 • 2−56.
So x = M•2−56 = 1/10 + 2/5•2−56.
Now we can figure out the result of computing 10•x with floating-point arithmetic. The result is as if we first compute 10•x with real-number arithmetic and then round to the nearest representable value. In real-number arithmetic, 10•x = 10•(1/10 + 2/5•2−56) = 1 + 10•2/5•2−56 = 1 + 4•2−56 = 1 + 2−54. The two neighboring representable values are 1 and 1 + 2−52, and 1 + 2−54 is closer to 1 than it is to 1 + 2−52. So the result is 1.