Wiem, że powinienem unikać używania zmiennych globalnych przede wszystkim z powodu takiego zamieszania, ale jeślibym ich używał, czy przestrzeganie tych zasad jest dobrym sposobem? (Próbuję wywołać globalną kopię zmiennej utworzonej w oddzielnej funkcji).
x = "somevalue"
def func_A ():
global x
# Do things to x
return x
def func_B():
x = func_A()
# Do things
return x
func_A()
func_B()
Czy x
druga funkcja używa tej samej wartości globalnej kopii, x
która func_a
używa i modyfikuje? Czy przy wywoływaniu funkcji po zdefiniowaniu kolejność ma znaczenie?
python
global-variables
Akshat Shekhar
źródło
źródło
Odpowiedzi:
Jeśli chcesz po prostu uzyskać dostęp do zmiennej globalnej, po prostu użyj jej nazwy. Jednak, aby zmienić jego wartość, musisz użyć
global
słowa kluczowego.Na przykład
Zmieniłoby to wartość zmiennej globalnej na 55. W przeciwnym razie po prostu przypisałoby 55 do zmiennej lokalnej.
Kolejność list definicji funkcji nie ma znaczenia (zakładając, że nie odnoszą się one do siebie w jakiś sposób), kolejność, w jakiej są nazywane, ma znaczenie.
źródło
x
infunc_B
jest zmienną lokalną, która pobiera swoją wartość z wartości zwracanej wywołania dofunc_A
- więc myślę, że byłaby to twoja (2)func_A
zmieni globalną zmienną podczas każdego uruchomienia i przywróci jąfunc_B
do użycia,func_B
będzie działać za każdym razem ze zmienioną wartością. Nie jestem pewien twojego „jak to naprawić”. Możesz zaakceptować najbardziej pomocną odpowiedź na bieżące / oryginalne pytanie, a następnie rozważyć otwarcie innego pytania o to, co wygląda na pytanie uzupełniające.x.append("...")
, zmieniona jest zmienna globalna x, ponieważ lokalna odwołuje się do globalnej.W zakresie Pythona każde przypisanie do zmiennej, która nie została jeszcze zadeklarowana w tym zakresie, tworzy nową zmienną lokalną, chyba że zmienna ta została zadeklarowana wcześniej w funkcji jako odnosząca się do zmiennej o zasięgu globalnym ze słowem kluczowym
global
.Spójrzmy na zmodyfikowaną wersję twojego pseudokodu, aby zobaczyć, co się stanie:
W rzeczywistości możesz przepisać wszystko
func_B
ze zmienną o nazwiex_local
i będzie działać identycznie.Kolejność ma znaczenie tylko w takim stopniu, w jakim twoje funkcje wykonują operacje zmieniające wartość globalnego x. Zatem w naszym przykładzie kolejność nie ma znaczenia, ponieważ
func_B
połączeniafunc_A
. W tym przykładzie kolejność ma znaczenie:Pamiętaj, że
global
jest to wymagane tylko do modyfikowania obiektów globalnych. Nadal możesz uzyskać do nich dostęp z poziomu funkcji bez deklarowaniaglobal
. Mamy zatem:Zwróć uwagę na różnicę między
create_locally
iaccess_only
-access_only
uzyskuje dostęp do globalnego x, mimo że nie dzwoniglobal
, i chociażcreate_locally
nie używaglobal
żadnego z nich, tworzy lokalną kopię, ponieważ przypisuje wartość.To zamieszanie powoduje, że nie powinieneś używać zmiennych globalnych.
źródło
Jak zauważyli inni, musisz zadeklarować zmienną
global
w funkcji, jeśli chcesz, aby ta funkcja mogła modyfikować zmienną globalną. Jeśli chcesz tylko uzyskać do niego dostęp, nie potrzebujeszglobal
.Aby przejść do bardziej szczegółowych informacji na temat tego, co oznacza „modyfikuj”, jest to: jeśli chcesz ponownie powiązać nazwę globalną, aby wskazywała na inny obiekt, nazwa musi zostać zadeklarowana
global
w funkcji.Wiele operacji, które modyfikują (mutują) obiekt , nie wiążą ponownie globalnej nazwy w celu wskazania innego obiektu, a zatem wszystkie są poprawne bez podania nazwy
global
w funkcji.źródło
Oto jeden przypadek, który mnie złapał, używając globalnej jako domyślnej wartości parametru.
Spodziewałem się, że param będzie miał wartość 42. Niespodzianka. Python 2.7 ocenił wartość globVar podczas pierwszej analizy funkcji func. Zmiana wartości globVar nie wpłynęła na domyślną wartość przypisaną do parametru. Opóźnianie oceny, jak poniżej, działało tak, jak tego potrzebowałem.
Lub, jeśli chcesz być bezpieczny,
źródło
is
aby sprawdzić, czy coś jestNone
, zamiast zwykłego porównania==
.Możesz bezpośrednio uzyskać dostęp do zmiennej globalnej wewnątrz funkcji. Jeśli chcesz zmienić wartość tej zmiennej globalnej, użyj „globalnej nazwy zmiennej”. Zobacz następujący przykład:
Ogólnie rzecz biorąc, nie jest to dobra praktyka programowania. Łamanie logiki przestrzeni nazw powoduje, że kod może być trudny do zrozumienia i debugowania.
źródło
Z
global
deklaracji należy skorzystać , aby zmienić wartość przypisaną zmiennej globalnej.Nie potrzebujesz go do odczytu ze zmiennej globalnej. Zauważ, że wywołanie metody na obiekcie (nawet jeśli zmienia dane w tym obiekcie) nie zmienia wartości zmiennej przechowującej ten obiekt (brak magii odbijającej).
źródło
xs.append(xs.pop(0))
działa dobrze bezglobal xs
.