Variabler Bereich (Python Newbie)

Ich benutze eine .pop-Methode auf einer globalen Liste innerhalb eines Funktionsblocks, aber die globale Liste wird außerhalb des Blocks aktualisiert. Ich dachte, dass lokale Variablen Globale Variablen nicht ändern können.

Das sollte nicht funktionieren, aber das tut:

import random PhraseBank = ['a','b','c','d'] def getPuzzle(secretphrase): phraseIndex = random.randint(0,len(PhraseBank)-1) secretphrase = PhraseBank.pop(phraseIndex) return secretphrase #Returns and item indexed from the PhraseBank while len(PhraseBank) != 0: secretphrase = getPuzzle(PhraseBank) #works print(secretphrase, PhraseBank) 

OUTPUT ist:

 a ['b', 'c', 'd'] d ['b', 'c'] c ['b'] b [] 

Warum wird PhraseBank immer aktualisiert Global, wenn ich es nur in einem Funktionsblock ändere?

3 Solutions collect form web for “Variabler Bereich (Python Newbie)”

Sie können einer globalen Variablen nicht innerhalb einer Funktion zuordnen (es sei denn, Sie verwenden explizit eine global Deklaration). Sie können Objekte ändern, die in globalen Variablen gespeichert sind.

Listen sind veränderlich. Sie ändern die Liste, auf die sich die PhraseBank bezieht, aber sie bezieht sich immer noch auf dieselbe Liste. Also ist die Variable nicht verändert (immer noch auf die gleiche Sache), aber das Ding hat sich geändert.

Wenn Sie der PhraseBank einen Wert PhraseBank , würde es nicht geändert werden, wenn Sie nicht sagen, dass Sie die globale Variable explizit verwenden. Jedoch ist jeder var in Python nur ein benannter Verweis auf ein Objekt. Sie lesen das var und ändern dann das Objekt, auf das es sich bezieht. Ja, du kannst die Referenz selbst nicht ändern, aber du kannst das Objekt ändern.

Also, was Sie konfrontiert haben, ist eines der typischsten Merkmale von Python. Alles ist ein Objekt, alle Variablen sind Referenzen. Das Verständnis dieser Tatsache hilft oft, viele Dinge zu verstehen, die seltsam erscheinen mögen. Ein gutes Beispiel:

 >>> li = [1] >>> a = (li, li) >>> a[0].append(1) >>> a[1] [1, 1] >>> li [1, 1] >>> li.append(1) >>> a ([1, 1, 1], [1, 1, 1]) 

Wenn nichts überrascht dich in das Verhalten des Codes oben, dann verstehst du, wie sind die Variablen und Objekte verwandt. 🙂 Hier werden die Variablen, die nicht berührt werden, geändert, aber nicht, weil sie beginnen, andere Objekte zu verweisen, sondern weil die Objekte, auf die sie sich beziehen, geändert werden. Also die Tupel, die unveränderlich sind. Ja, sind Sie. Ein Tupel, einmal erstellt, bezieht sich immer auf die gleichen Objekte. Aber jedes dieser Objekte kann geändert werden.

  • Kurze Beschreibung der Scoping Regeln?
  • Warum ist eine Klassenvariable nicht im Listenverständnis definiert, sondern eine andere ist?
  • Warum verschachtelte Funktionen auf Variablen von äußeren Funktionen zugreifen können, aber sie nicht ändern dürfen [duplizieren]
  • Funktion Ortsname Bindung aus einem äußeren Bereich
  • Wie kann man Variablen eines anderen Bereichs ändern?
  • Generierung von Funktionen innerhalb der Schleife mit Lambda-Ausdruck in Python
  • Python: Wie kann ich eval () im lokalen Gültigkeitsbereich einer Funktion ausführen?
  • Was bedeutet Umfang
  • Python: Wie erfasse ich eine Variable, die in einem nicht globalen Ahnenumfang angegeben ist?
  • UnboundLocalError bei der Manipulation von Variablen ergibt inkonsistentes Verhalten
  • Globals und Einheimische in python exec ()
  • Python ist die beste Programmiersprache der Welt.