В очередной раз столкнулся с "новички не умеют пользоваться global", поэтому для них написал 8 примеров для проверки понимания global, ну и mutable/immutable заодно.
# ok
foo = 1
def bar():
print('in bar', foo)
bar()
print('out bar', foo)
# ok
foo = 1
def bar():
foo = 2
print('in bar', foo)
bar()
print('out bar', foo)
# UnboundLocalError
foo = 1
def bar():
print('1, in bar', foo)
foo = 2
print('2, in bar', foo)
bar()
print('out bar', foo)
# ok
foo = 1
def bar():
global foo
print('1, in bar', foo)
foo = 2
print('in bar', foo)
bar()
print('out bar', foo)
# UnboundLocalError
foo = [1]
def bar():
print('1, in bar', foo)
foo = [2]
print('2, in bar', foo)
bar()
print('out bar', foo)
# ok
foo = [1]
def bar():
global foo
print('1, in bar', foo)
foo = [2]
print('2, in bar', foo)
bar()
print('out bar', foo)
# ok ;)
foo = [1]
def bar():
print('1, in bar', foo)
foo.append(2)
print('2, in bar', foo)
bar()
print('out bar', foo)
# ok ;)
foo = [1]
def bar():
print('1, in bar', foo)
foo[:] = [2]
print('2, in bar', foo)
bar()
print('out bar', foo)