Der entscheidende Punkt ist, dass Karl Rudolf sein Argument str genannt hat. Damit ist im Lokalen Namespace der Name str an den Wert "7" gebunden. Wenn nun am Ende der Funktion str(i) aufgerufen werden soll, sieht Python zunächst dort nach, findet den gesuchten Namen und gibt den Wert "7" zurück – der arme String weiß aber nicht, was er mit Argumenten anfangen soll oder wie er einen Wert zurückgeben soll (“is not callable”), daher die Exception.

Generell ist es nicht empfehlenswert, irgendwelche Namen im globalen Namespace auch im lokalen zu definieren, auch wenn Python selbst damit keine Probleme hat – es verwirrt die LeserInnen von Programmen, und gelegentlich auch ihre AutorInnen. Das gilt ganz besonders für von Python vordefinierte Namen der eingebauten Funktionen.