2015-11-24 19 views
6

Recentemente mi sono imbattuto in un comportamento insolito.Python Import Star Creazione di uno spazio dei nomi nascosto?

foo.py

a = 0 
def bar(): 
    print (a) 

Console:

>>> import foo 
>>> foo.bar() 
0 
>>> foo.a = 10 
>>> foo.bar() 
10 

Console:

>>> from foo import * 
>>> bar() 
0 
>>> a 
0 
>>> a = 10 
>>> a 
10 
>>> bar() 
0 

sto dedurre che import * è in realtà la creazione di due copie di a - uno nel mondiale spazio dei nomi e uno all'interno del modulo foo che non può essere accessibile ed. Questo comportamento è spiegato/documentato ovunque? Sto avendo difficoltà a capire cosa cercare.

Questa sembra una conseguenza notevole e inaspettata di import * ma per qualche motivo non l'ho mai visto prima.

+3

Questo è un comportamento ben definito, non esiste uno spazio dei nomi nascosto, è solo che ogni funzione ha una conoscenza delle sue globali del modulo. Globali nel modulo corrente non avranno effetto sui globali di un modulo importato. [* Ogni modulo ha una propria tabella dei simboli privata, che viene utilizzata come tabella dei simboli globale da tutte le funzioni definite nel modulo. Pertanto, l'autore di un modulo può utilizzare variabili globali nel modulo senza preoccuparsi di conflitti accidentali con le variabili globali di un utente. *] (Https://docs.python.org/3/tutorial/modules.html#more-on- moduli) –

+0

In Python non esiste essenzialmente un globale definito dall'utente. C'è un brutto trucco per creare veri globali, che in pratica non dovresti mai usare, ma tutto ciò che definisci come 'a = 10' è al massimo livello di modulo. – user2357112

+0

L'originale 'a' di' foo' fa parte della chiusura di quella funzione – jonrsharpe

risposta

Problemi correlati