Also arbeite ich an einem Spiel und hier ist mein aktueller Code, der gut funktioniert:

print("Type directions() to see commands" )

def directions() :

    print("Type North, East, South or West to move" )
    move = input("North, East, South or West? ")
    if move == "North":
    north()
    elif move == "East":
    east()
    elif move == "South":
    south()
    elif move == "West":
    west()


def north():
    print("You moved North")
    x=0
    x=(x+1) 
    print("You are at co-ordinates", x, "x:0 y" )

Mir ist jedoch bewusst, dass es später ein Problem geben wird, da x für jede Richtung zurückgesetzt wird. Wenn ich x=0 an die Spitze des Codes setze und es aus dem def north() Teil entferne, gibt mir Python beim Ausführen des Codes den Fehler:

'UnboundLocalError: Lokale Variable' x ', auf die vor der Zuweisung verwiesen wird'

Wie kann ich dies so codieren, dass 'x' zunächst 0 ist, aber durch def -Funktionen geändert werden kann?

0
user2990213 30 Nov. 2013 im 00:55

3 Antworten

Beste Antwort

Sie haben zwei Möglichkeiten: Verwenden Sie entweder eine globale Variable (die größtenteils vermieden werden sollte) oder Rückgabewerte. Die globale Methode:

x=0
.
.
def directions():
    .
    .
def north():
    global x
    x=x+1
    print("moved north...")

Oder der Rückgabewert:

def directions():
    current_location = 0
    .
    .
    if move == "North":
         current_location = North(current_location)
    .
    .
def North(location):
    print("moved north...")
    return location+1

Nach Ihrer Frage und der Existenz von y können Sie Folgendes tun:

def directions():
.
.
    if move == "North":
        (x,y) = North(x,y)
.
.
def North(x,y):
    return (x+1,y)
def East(x,y):
    return (x,y+1)
def South(x,y):
    return (x-1,y)
1
micromoses 29 Nov. 2013 im 21:14

In Anlehnung an das, was Cygwinnian vorgeschlagen hat, wird das Problem behoben, wenn x zu einer globalen Variablen gemacht wird. Das bedeutet, dass auf alle x Variablen von allen Funktionen aus zugegriffen werden kann, die global x deklarieren, bevor sie x verwenden.

So beheben Sie Ihren Fehler:

x = 0

print("Type directions() to see commands" )

def directions() :
    print("Type North, East, South or West to move" )
    move = input("North, East, South or West? ")
    if move == "North":
    north()
    elif move == "East":
    east()
    elif move == "South":
    south()
    elif move == "West":
    west()


def north():
    global x
    print("You moved North")
    x=(x+1) 
    print("You are at co-ordinates", x, "x:0 y" )
0
jaynp 29 Nov. 2013 im 21:09

Einige Tipps (nicht erschöpfend, aber für den Anfang genug):

Verwenden Sie zunächst ein globales Wörterbuch für Ihre Anweisungen:

def north(x):
    return x+1

directions = {'North': north, 'East': east, 'South': south, 'West': west}
def move(x) :
    global directions
    print("Type North, East, South or West to move")
    move_choice = input("North, East, South or West? ")
    # modify lambda to your logic to handle incorrect inputs
    x = directions.get(move, lambda y:y)(x)
    repr(x)
    return x

Und wenn Sie einen funktionalen Ansatz wünschen (im Gegensatz zu OOP), müssen Ihre Funktionen einige Argumente akzeptieren:

def north(x):
    return x+1

Mischen Sie nicht Ihre Logik und Darstellung, auf diese Weise müssen Sie eine Menge Code kopieren:

def repr(x):
    print("You are at co-ordinates {} x:0 y".format(x))

Und kombiniere sie in der Routine main:

def main():
    x = 0
    while True: # modify to be able to terminate this loop
        x = move(x)
1
alko 29 Nov. 2013 im 21:11