2012-05-08 15 views
40

Ich habe zwei spezifische Situationen, in denen ich nicht verstehen, wie funktioniert in Python zu importieren:Wie funktioniert der Import von Python genau?

erste spezifische Situation:

Wenn ich das gleiche Modul in zwei verschiedenen Python-Skripte zu importieren, ist das Modul nicht zweimal importiert, oder? Wenn Python das erste Mal darauf trifft, wird es importiert, und beim zweiten Mal überprüft es, ob das Modul importiert wurde, oder erstellt es eine Kopie?

2. spezifische Situation:

das folgende Modul Betrachten genannt bla.py:

a = 10 

Und dann haben wir foo.py, ein Modul, das bla.py importiert:

from bla import * 

def Stuff(): 
    return a 

Und Danach haben wir ein Skript namens bar.py, die vom Benutzer ausgeführt wird:

from foo import * 
Stuff() #This should return 10 
a = 5 
Stuff() 

Hier weiß ich nicht: Ist Stuff() Rückkehr 10 oder 5?

+12

Was ist passiert, als Sie den Code ausgeführt haben? – geoffspear

+0

Sie können diese interessant finden: http://lucumr.pocoo.org/2011/9/21/python-import-blackbox/ und http://lucumr.pocoo.org/2009/7/24/singletons-and- ihre-Probleme-in-Python /. Beide behandeln Importe in Python. – rubik

Antwort

50

Teil 1

Das Modul nur einmal geladen wird, so gibt es keinen Leistungsverlust wieder durch sie zu importieren. Wenn Sie wirklich wollten, dass es erneut geladen/geparst wird, müssten Sie das Modul reload().

Der erste überprüfte Platz ist sys.modules, der Cache aller Module, die zuvor importiert wurden. [source]


Teil 2

from foo import * Importe a auf den lokalen Bereich. Wenn ein Wert a zugewiesen wird, wird er durch den neuen Wert ersetzt - aber die ursprüngliche foo.a Variable wird nicht berührt.

Wenn Sie also nicht import foo und foo.a ändern, geben beide Aufrufe denselben Wert zurück.

Für einen veränderlichen Typ wie eine Liste oder ein Diktat wäre es anders, die Änderung würde tatsächlich die ursprüngliche Variable beeinflussen - aber die Zuweisung eines neuen Wertes würde immer noch nicht ändern foo.whatever.

Wenn Sie mehr Informationen wünschen, haben einen Blick auf http://docs.python.org/reference/executionmodel.html:

Die folgenden Konstrukte Namen binden: formale Parameter an Funktionen, Import-Anweisungen, Klassen- und Funktionsdefinitionen (diese binden die Klasse oder Funktionsname im definierenden Block) und Ziele, die Bezeichner sind, wenn sie in einer Zuweisung, for loop header, an der zweiten Stelle eines except-Klausel-Headers oder danach wie in einer with-Anweisung auftreten.

Die beiden fett Abschnitte sind die relevantesten für Sie: Zuerst wird der Name a auf den Wert von foo.a während des Imports gebunden ist. Wenn Sie dann a = 5 tun, ist der Name a an 5 gebunden. Da das Ändern einer Liste/dict keine Bindung verursacht, würden diese Operationen die ursprüngliche ändern (b und foo.b sind an dasselbe Objekt gebunden, an dem Sie arbeiten). Ein neues Objekt zu b zuzuordnen würde wieder ein Bindevorgang sein und somit b von foo.b trennen.

Es ist auch erwähnenswert, was genau das import Aussage macht:

  • import foo bindet den Modulnamen an das Modul Objekt im aktuellen Bereich, wenn Sie also foo.whatever ändern, werden Sie mit dem Namen in der Arbeit Modul - Änderungen/Zuordnungen wirken sich auf die Variable im Modul aus.
  • from foo import bar bindet nur die angegebenen Namen (d. H. foo bleibt ungebunden) an das Element mit dem gleichen Namen in foo - so Operationen auf bar verhalten sich wie zuvor erklärt.
  • from foo import * verhält sich wie der vorherige, aber es importiert alle globalen Namen, denen kein Unterstrich vorangestellt ist. Wenn das Modul __all__ definiert, werden nur Namen innerhalb dieser Sequenz importiert.

Teil 3 (die nicht einmal in Frage existiert: p)

Die Python-Dokumentation sehr gut und in der Regel ausführliche - Sie finden fast jeden möglichen Sprachkenntnisse zu auf Frage drinnen. Hier sind einige nützliche Links:

2

Um Ihre erste Frage zu beantworten:

Nein, Python wird nicht zweimal importiert. Wenn Python ein Modul lädt, sucht es in sys.modules nach dem Modul. Wenn es nicht da ist, wird es hineingelegt und geladen.

Um Ihre zweite Frage zu beantworten:

Module können festlegen, welche Namen sie in ein from camelot import * Szenario exportieren, und das Verhalten Namen für die vorhandenen Werte zu schaffen, nicht vorhandenen Variablen zu referenzieren (Python haben keine Referenzen).

Bei einem etwas verwandten Thema, from camelot import * ist not the same as a regular import.

+0

Sieht so aus, als ob ThiefMaster mich geschlagen hat, um den Schnitt zu beantworten. Ich lasse das hier nur um das "' aus camelot import * 'ist nicht das selbe wie ein normaler Import." – Darthfett

Verwandte Themen