2017-02-23 5 views
1

In Python 3.0, wenn ich den folgenden Code für ein Hangman SpielVariablenwert zu ändern, ohne expliziten Aufruf

secretWord = list("Apple") 
compareWord = secretWord 
print("".join(secretWord)) 

for (index , alphabet) in enumerate(secretWord): 
    compareWord[index] = "_" 

print("".join(secretWord)) 

Das Ergebnis laufen ist

Apple 
_____ 

Warum es das geheime Wort geändert hat? Ich wollte nur compareWord modifizieren, so dass es von SecretWord zu Unterstrichen wurde.

Antwort

2

Dies geschieht, weil beide secretWord und compareWord auf die gleiche Liste. Die erste Codezeile erstellt eine neue Liste aus der Zeichenfolge Apple und weist diese Liste secretWord zu. Die zweite Zeile weist diese Liste compareWord zu - beide Variablen zeigen jetzt auf dieselbe Liste! Die for-Schleife ändert jedes Element in der Liste in einen Unterstrich. Beim Drucken dieser Liste werden zu Recht 5 Unterstriche angezeigt.

Wenn Sie den print("".join(secretWord))-Aufruf nach der Schleife verschieben, sehen Sie, dass die Ausgabe dieses Aufrufs ebenfalls in die 5 Unterstriche geändert wurde.

Eine einfache Möglichkeit, dies zu beheben, besteht darin, eine Kopie der Liste zu compareWord zuzuordnen (dh eine neue Liste, aber mit dem gleichen Inhalt des alten). Für exmaple:

  • Slicing: compareWord = secretWord[:]
  • Neue Liste Aufruf: compareWord = List(secretWord)

Für einige detaillierte Informationen darüber, wie eine Liste in Python zu klonen, siehe How to clone or copy a list?

Für einige Intro auf Python und Listen, siehe https://developers.google.com/edu/python/lists, zeigt dies auch schön das Problem Ihrer Begegnung.

2

Listen sind veränderbare Objekte und Linie in folgende Sie creatign eine weitere Kopie von secretWord mit Namen compareWord:

compareWord = secretWord 

Deshalb, wenn Sie ändert sich die compareWord Sie das Hauptobjekt ändern, das, was ist, dass secretWord zeigt auf .

Für die Fahrt von diesem Problem müssen Sie eine Kopie Ihrer Liste übergeben, wenn es eine 1D-Liste ist, können Sie eine flache Kopie verwenden, ansonsten verwenden Sie copy.deepcopy.

compareWord = secretWord[:] # shallow copy 
Verwandte Themen