class X: def x(self): print b #b=2 b=1 X().x()
It compiles and runs just fine. However if you would remove comment from line "b=2", magically expression "print b" on the previous line will become invalid and compiler will give you an error: for it "UnboundLocalError: local variable 'b' referenced before assignment".
Of course the language spec, explains this phenomenon:
"If a name binding operation occurs anywhere within a code block, all uses of the name within the block are treated as references to the current block. This can lead to errors when a name is used within a block before it is bound. This rule is subtle. Python lacks declarations and allows name binding operations to occur anywhere within a code block. The local variables of a code block can be determined by scanning the entire text of the block for name binding operations."
But this does not make this right. It goes against every instinct of an experienced developer.