In Python, the following code works:
a = 1
b = 2
def test():
    print a, b
test()
And the following code works:
a = 1
b = 2
def test():
    if a == 1:
        b = 3
    print a, b
test()
But the following does not work:
a = 1
b = 2
def test():
    if a == 1:
        a = 3
    print a, b
test()
The result of this last block is an UnboundLocalError message, saying a is referenced before assignment. 
I understand I can make the last block work if I add global a in the test() definition, so it knows which a I am talking about. 
Why do I not get an error when assigning a new value to b? 
Am I creating a local b variable, and it doesn't yell at me because I'm not trying to reference it before assignment? 
But if that's the case, why can I print a, b in the case of the first block, without having to declare global a, b beforehand? 
 
     
     
    