Yes there is lookup, always lookup. Dynamic language, something in loop could change what lstr is.
Each "dot" incurs lookup. Your example reminds me of one idiom. Assigning nested.look.up to local var for access inside loop.
Each "dot" incurs lookup. Your example reminds me of one idiom. Assigning nested.look.up to local var for access inside loop.
And why is that presented as something inevitable?
The interpreter/compiler could analyze that part and see that the function/name is not changed during the loop, and cache for that.
I'd guess that PyPy tries to do it that way, anyway...