Ciao @Gila, ben tornato nelle "Tragedie" di python,
gila75 ha scritto: ↑venerdì 1 aprile 2022, 9:44
Mi da errore. Non capisco, con import mcm non importo tutto ? Anche le librerie che usa il modulo?
No.
Come ben dice @DoctorStrange è una questione di visibilità dei nomi (Namespace), ogni modulo ha il suo namespace, cosi come ogni funzione ha il suo namespece, esempio:
Codice: Seleziona tutto
>>> def foo():
x = 5
while x:
print(x)
x -=1
print(x)
>>> x = 10
>>> foo()
5
4
3
2
1
0
>>> print(x)
10
>>>
Come vedi dal codice sopra, ho definito una funzione che istanzia una variabile "x" e la azzera in un ciclo, poi nel namespace che "contiene" la funzione ho dichiarato una variabile di nome "x" e quindi ho eseguito la funzione, la variabile "x" dichiarata nel namespace globale è rimasta invariata mentre la "x" della funzione è stata evidentemente azzerata, ciò avviene perché le due "x" sono oggetti diversi, appartenendo a namespace diversi, oltre tutto, il namespace interno alla funzione, viene "perso" all'uscita della funzione e non può essere consutato all'esterno della funzione stessa.
È una condizione piuttosto "articolata", non complessa ma da tener presente, dato che può dare "sorprese", p.e. una variabile definita all'interno del namespace di una funzione non è visibile dall'esterno, una variabile definita nel namespace che "continene" la funzione è visibile dalla funzione, che può utilizzarne il valore
Codice: Seleziona tutto
>>> def spam():
print(x * 5)
>>> x = 3
>>> spam()
15
>>>
ma se appena va ad assegnarle un valore entra immediatamente in gioco il namespace locale, che ovviamente restituisce errore
Codice: Seleziona tutto
>>> x = 3
>>> spam()
15
>>> def baz():
x += 1
>>> baz()
Traceback (most recent call last):
File "/usr/lib/python3.8/idlelib/run.py", line 559, in runcode
exec(code, self.locals)
File "<pyshell#46>", line 1, in <module>
File "<pyshell#45>", line 2, in baz
UnboundLocalError: local variable 'x' referenced before assignment
>>>
per altro, esistono diversi tipi di namespaces ed è anche possibile interagire tra funzioni e variabili dello spazio globale (dichiarazione con "global") ed anche se ogni modulo ha un suo spazio globale, è possibile leggersi le variabili globali dichiarate ... se Ti è utile,
qui una buona spiegazione
[Edit] mi si è persa una parte del post in cui rispondevo circa l'importazione dei moduli, che avviene comunque una volta sola, la prima volta che un modulo viene importato e poi precisavo che, comunque, è possibile importare una sola funzione o classe, invece di un intero modulo, ed ho esemplificato per il codice di calcolo del minimo comune multiplo per una lista di interi, come sotto.
Codice: Seleziona tutto
>>> from math import gcd
>>> from functools import reduce
>>> def f(l):
def mcm(a, b):
return a * b // gcd(a, b)
x = reduce(mcm, l)
return x
>>> l = [40, 15, 27]
>>> f(l)
1080
>>>
in analogia, potresti importare il solo "sqrt" da math nel secondo modulo per le altre operazioni.
Spero Ti sia utile