Here is a general pic of the process
While that is true for the majority of PLCs on the market, it certainly is not true for the A-B Logix5000 series of PLCs, and by that I mean ControlLogix, CompactLogix, DriveLogix, and FlexLogix (now virtually redundant).
On those hardware platforms, the I/O update is not synchronous to the user program scan, and data is exchanged with the I/O modules during a "time-slice" of processor operations. This "System Overhead Time-Slice" (SOTS) is a background task that overrides virtually everything, and one of its major functions is to exchange data with other modules in the system, including I/O modules.
Think of the Logix5000 system as being a collection of modules exchanging data (via a method called Producer/Consumer), the rate or period of exchange being controlled by each module independently of the user's program.
What this means is that an input can be read at different states throughout the execution of one "scan" of the control program. This has to be taken into account if you intend to read a physical input more than once in the application. It may, or may not, cause any issues, but only the programmer would know this.
"Buffering" the inputs, by mapping them once only to internal tags, and using the internal tags as the input state in the rest of the logic overcomes this potential issue.