2009-04-13 18 views
4

foo.py:Importe in Python sind statisch, jede Lösung?

i = 10 

def fi(): 
    global i 
    i = 99 

bar.py:

import foo 
from foo import i 

print i, foo.i 
foo.fi() 
print i, foo.i 

Dies ist problematisch. Warum ändert sich i nicht, wenn sich foo.i ändert?

+0

Die Ausgabe ist wie folgt: 10 10 \ n 10 99 –

+0

die Frage ist nicht wirklich klar. Benutze einfach foo.i, was genau ist das Problem? Faulheit? – hasen

+0

Dies ist eine ziemlich klare Anfängerfrage. Er will, dass ich 99 bin, nachdem er foo.fi() angerufen hat. Ich denke, dass ihm die Ausführung des Moduls fehlt. +1 zu neutralisieren. –

Antwort

7

Was import in bar.py tut, ist eine Kennung i im bar.py Modul Namensraum genannt, die i als Kennung an die gleiche Adresse verweist eingerichtet im foo.py Modul Namensraum genannt.

Dies ist ein wichtiger Unterschied ... bar.i verweist nicht auf foo.i, sondern auf den gleichen Platz im Speicher, wo das Objekt 10 wird festgestellt, dass foo.i bis zur gleichen Zeit Punkt passiert. In Python sind die Variablennamen nicht der Speicherplatz ... sie sind der Bezeichner, der auf einen Speicherbereich zeigt. Wenn Sie in bar importieren, richten Sie eine lokale Namespace-ID ein.

Ihr Code verhält sich wie erwartet bis foo.fi() aufgerufen wird, wenn die Kennung i im foo.py Namespace wörtlichen 99 Punkt geändert wird, die ein Objekt im Speicher ist offensichtlich an einem anderen Ort als 10. Nun das Modul -level Namespace dict für foo hat i identifiziert ein anderes Objekt im Speicher als der Bezeichner i in bar.py.

Shane und rossfabricant haben gute Vorschläge, wie Sie Ihre Module anpassen können, um zu erreichen, was Sie wollen.

0

Sie könnten eine Funktion aufrufen, anstatt eine globale Variable zu referenzieren.

8

Was Ross sagt, ist foo zu restucture wie so:

_i = 10 

def getI(): 
    return _i 

def fi(): 
    global _i 
    _i = 99 

Dann werden Sie sehen, es funktioniert so, wie Sie wollen:

>>> import foo 
>>> print foo.getI() 
10 
>>> foo.fi() 
>>> print foo.getI() 
99 

Es ist auch 'besser' in dem Sinne, dass Sie vermeiden es, global zu exportieren, bieten aber dennoch Lesezugriff darauf.

3

i innen foo.py ist ein verschiedeneni von dem in bar.py. Wenn in bar.py Sie tun:

from foo import i 

, dass eine neue i in bar.py schafft, dass auf das gleiche Objekt bezieht sich als i in foo.py.

Ihr Problem ist: Wenn Sie foo.fi() anrufen und es tut der:

i = 99 

Diese Zuordnung foo.py ‚s i Punkt zu einem anderen Integer-Objekt macht (99). Ganzzahlige Objekte sind selbst unveränderlich (Gott sei Dank), also ändert sich nur das, was foo.pys i zeigt.Nicht bar.py 's i. bar.py 's i zeigt immer noch auf das alte Objekt, vor dem es zeigte. (Die ganze Zahl unveränderliches Objekt 10)

Sie testen können, was ich spreche, indem Sie den folgenden Befehl Platzierung in bar.py:

print foo.i 

sollte 99 drucken.

+0

Schöne Erklärung. –

Verwandte Themen