Title: Namespaces/Globale und Lokale Variablen

## Namespaces

Gegeben ist wieder dieser Code:

def quadrat(x):
return x * x
print(quadrat(3))
print(quadrat(4))

Beachte die Zeile `x=4`.

Die Zeile sieht harmlos aus, aber die Variable x wird auch in der Funktion
Quadrat verwendet - Es besteht dadurch die Gefahr, dass es zu
Nebeneffekten kommen kann, vor allem wenn im Team gearbeitet wird:

Wenn mehrere Entwickler Funktionen schreiben, dann ist die Chance hoch, dass sie
die gleichen Variablennamen verwenden.

Zum Glück gibt es dafür eine Lösung: **Namespaces**

Die Variable x in der Funktion **quadrat** ist **nicht** die
gleiche Variable wie in deinem Hauptprogramm.

Deutlich wird das in folgendem Programm:

def do_something(x):
print(x)
do_something(x)
print(x)

x ist **innerhalb** einer Funktion **nicht** das gleiche
wie x **außerhalb** dieser Funktion - Beide verweisen auf unterschiedliche Stellen im Speicher.

Auf diese Weise können Funktionen vollkommen unabhängig vom Hauptprogramm
geschrieben werden. Man muss nicht befürchten, dass man versehentlich eine
Variable aus dem Hauptprogramm ändert.

Wenn du Variablen aus dem Hauptprogramm ändern willst, dann geht dies
z.B. über Rückgabewerte:

def do_something(x):
return x
print(x)
x = do_something(x)
print(x)

Hier gibt die Funktion den veränderten Wert x zurück
und dieser wird in der Variablen x des Hauptprogrammes gespeichert.

### Global

Will man auf eine Variable zugreifen, die außerhalb der Funktion definiert wurde, dann
verwendet man das Schlüsselwort **global**, um explizit auf diese Variable zuzugreifen.

Dies wird besonders in p5 Programmen oft benötigt:

import p5

import math

t = 0 # Diese Variable ist global definiert

def setup():
p5.createCanvas(200, 200)

def draw():
global t # Hier wird definiert, dass innerhalb von draw die globale Variable t verwendet wird.
p5.clear()

p5.run()