[python] zasięg zmiennych

0

Nie wiem czy ktoś na tym forum pisze coś w pythonie, ale może jednak ktoś sie znajdzie i mi pomoże. Mam taki o to problem:
W pliku o przykładowej nazwie xyz1.py mam:

#!/usr/bin/env python
x = 5
import xyz2
xyz2.run()
print x

a w pliku xyz2.py jest:

def run:
    x = 8

I po wykonaniu xyz1.py x nadal ma wartość 5, ponieważ w funkcji run zamiast zmienić wartość globalnego x, tworzy sobie lokalną zmienną x. Jeśli np funkcję run przerobię na:

def run:
    global x
    x = 8

To dostaję komunikat "Global variable 'x' not defined".
Podany kod miał służyć jedynie wytłumaczeniu mojego problemu. Chodzi mi o to, jak mam to zrobić żeby funkcja w drugim module widziała i mogła zmienić zmienną z pierwszego (głównego) modułu bo mi już normalnie ręce (z klawiatury) opadają.

Pozdrawiam i dziękuje jeśli ktoś zechce albo będzie umiał mi pomóc.

0

Niestety (a może stety) w pythonie każdy moduł ma własną tablicę symboli i nie można odwołać się w tak prosty sposób do innej.

Musisz po prostu wywołać funkcję z wartością zmiennej (jeżeli chcesz mieć do niej dostęp) i zwrócić przez return wartość:
xyz1.py:

#!/usr/bin/env python
x = 5
import xyz2
print xyz2.run(x)

xyz2.py:

def run(x):
    x = 8
    return x
0

Dzięki za odpowiedź Dryobates. Jestem jeszcze początkujący w pythonie, ale wymyśliłem już rozwiązanie swojego problemu. Wszystkie zmienne które mają być widoczne w innych modułach wrzucam do jednej klasy i modułom przekazuję tylko tę klasę. Przykład mojej metody:
xyz1.py

#!/usr/bin/env python
class cos:
    x = 1
    y = 5

import xyz2

if __name__ == "__main__":
   xyz2.cosik = cos
   print "x:",cos.x,",y:", cos.y
   xyz2.zmien()
   print "x:",cos.x,",y:", cos.y

xyz2.py:

def zmien():
    cosik.x = 5
    cosik.y = 7

Jako dowód podaję wyciąg z konsoli:

x: 1 ,y: 5
x: 5 ,y: 7

Czyli wszystko działa. xyz2.cosik jest takim jakby wskaźnikiem na xyz1.cos, więc takie rozwiązanie mnie zadowala.

Pozdro, Peace.

0

Oryginalne. Ale ja jednak wolę trzymać się z dala od zmiennych globalnych i pozostać przy wykorzystaniu modułowości do maksimum:

xyz1.py:

#!/usr/bin/env python
x = 1
y = 5
import xyz2
print "x:", x, ", y:", y
x, y = xyz2.run(x, y)
print "x:", x, ", y:", y

xyz2.py:

def run(x, y):
    x = 5
    y = 7
    return (x, y)

Wydruk:
x: 1 , y: 5
x: 5 , y: 7

W pythonie jest sporo niespodzianek nietypowych dla języków proceduralnych, ale charakterystycznych dla funkcyjnych itp. Czasem wymaga to przestawienia się, ale w większości przypadków mocno przyspiesza pisanie kodu.

0

Jednak moja metoda może się przydać w programie nad którym aktualnie pracuję. To taki prosty programik: małe okienko, kilka labeli (jid, serwer, haslo, zasob, adresat), jedno memo (wpisywanie wiadomosci), 3 przyciski (połącz, rozłącz, wyślij). Służy on do wysyłania pojedyńczych wiadomości do wybranego użytkownika Jabbera. Robię go żeby lepiej poznać pythona, PyQt i bibliotekę xmpppy (podobno pyxmpp lepsze). I właśnie moja metoda jest chyba lepsza, bo formatka w qt (jej klasa) będzie ciągle miała do dyspozycji zmienne, a nie tylko podane jako parametr funkcji. Jeśli ten mój "Wysyłacz wiadomości" będzie działał, może zabiorę sie za jakiegoś prostego im'a w pythonie. Zacząłem już nawet pisać bibliotekę pygadu (GG dla pythona), tylko coś nie działa mi hash gg bo funkcja daje inny wynik niż ta sama w pascalu czy c...
Dobra, koniec OT i dzięki za zainteresowanie tematem :) .

Pozdro, Peace.

1 użytkowników online, w tym zalogowanych: 0, gości: 1