Bisher hat man mir hier gesagt, dass nicht nur Variablen, denen man mit dem Zuweisungsoperator etwas zuweist, Variablen sind, sondern auch Dictionarys, die man erweitert und damit auch Methoden und Funktionen, denen man Werte als Parameter übergibt.__deets__ hat geschrieben:Globaler Zustand existiert. Niemand hat das Gegenteil behauptet. Aber in den allermeisten Fällen lässt er sich vermeiden, und da wo es nicht geht kann man ihn immer noch explizit als Abhängigkeit reinreichen. Damit die nächste Ebene wenigstens sauber Test Bär und wiederverwendbar bleibt.
Somit ist also auch "print()" eine Variable. Funktionen in Python können sich nur etwas merken, indem sie es außerhalb ihrer speichern. In C heißen Variablen, die nur in ihrem Modul sichtbar sind, interne Variablen. In Python kann man nur durch einen Unterstrich markieren, daß das eigentlich interne Variablen sein sollen, und man nennt sie dann trotzdem Globale Variablen.
Die Funktion print bzw. davon weiter aufgerufene Funktionen merken sich die Zeile, in die ausgegeben wurde. Außerdem wird diese Zeile hochgezählt, sofern sie nicht am unteren Rand ist. Wenn sie bereits am unteren Rand ist, wird der ganze Terminalscreen außerdem um eine Zeile nach oben gescrollt. Die Funktion print ändert also ganz massiv einen globalen Zustand und ist damit eine Variable und sogar eine globale.
Das kann auch Seiteneffekte haben, wenn nämlich verschiedene Module auf den selben Screen schreiben. print ist nicht instanzierbar und schreibt immer auf den selben screen. Das ist eine globale Variable, die viele Fehler bei der Ausgabe verursachen kann, wenn auf diese in undisziplinierter Weise zugegriffen wird. Daher sollte man diese Funktion als Parameter übergeben, damit dann kein globaler Zugriff erfolgt. So kann man das etwa implementieren:
Code: Alles auswählen
# statt print('Application has started')
# schreibe man:
class Print_Class():
def __init__(self,print_function):
self.print_function = print_function
def output(self,value):
self.print_function(value)
class Application():
def __init__(self,print_object):
self.print_object = print_object
self.print_object.output('Application has started')
def main():
Application(Print_Class(print))
main()
Also in Python wird das meist falsch gemacht, wie etwa auch vom Modul sys:
sys.stdout.write('Dive in')
sys.stdout ist ein bereits instanziertes Objekt und damit eine globale Variable. Mit sys.stdout.write('Dive in'), wird dann ein globaler Zustand geändert.