Problem: This is because Python’s scoping rules are demented. The presence of the += assignment operator marks the target, num_converted, as local to the enclosing function’s scope, and there is no sound way in Python 2.x to access just one scoping level out from there. Only the global keyword can lift variable references out of the current scope, and it takes you straight to the top.
Fix: Turn num_converted into a single-element array.
num_converted = [0]
def convert_variables(m):
name = m.group(1)
num_converted[0] += 1
return '<%%= %s %%>' % name