LINUX.ORG.RU

[pyhton]Поведение лок.переменных в модуле

 


0

1

Основная программа

import sc

while True:
    sc.tst()

Модуль sc
global tvar
tvar = 10

def tst():
    print(tvar)
    #sc.tvar += 1

Так вот, если раскомментить tvar += 1, то будет ошибка:

Traceback (most recent call last):
File «D:\oz86files\dev\learn py\mn.py», line 5, in <module>
sc.tst()
File «D:\oz86files\dev\learn py\sc.py», line 4, in tst
print(tvar)
UnboundLocalError: local variable 'tvar' referenced before assignment


Т.е. к локальным переменным модуля нельзя получить доступ из функций самого этого модуля? Global не помогает, да и не нужно. Помог только вариант с присвоением пременной и передачей значения в функцию из основной программы.
Есть-ли другие способы? Т.к. это ужасный костыль.
Надо чтобы функции в модуле могли сами присваивать новые значения внутренним переменным модуля.



Последнее исправление: rip86oz (всего исправлений: 1)

Если хочешь изменить переменную, то само собой ее надо в функцию передать. Зачем переменную тварью назвал?)

tanenn
()

Ну а по делу если, то думаю это наведет на верный путь.

a = 10
def f():
        global a
        a+=1
        print a
f()

выведет 11 если что)

tanenn
()
Ответ на: комментарий от tanenn

Спасибо.

ЗЫ. Насколько понимаю, используя изменяемые объекты (вроде листов, классов и т.п.), проблема отпадает, т.к. в функцию передаётся «указатель», и соответсвенно по указателю можно изменять значения. Это так?

ТВАР??... неужто моё ноухау??

rip86oz
() автор топика

global надо прописать в самой функции, чтобы указать, что tvar - это глобальная переменная. В модуле global прописывать необязательно.

userid2
()
Ответ на: комментарий от rip86oz

Не совсем. Например,

a = 10
def f(a):
        a+=1
f(a)
print a
выведет 10. Но если мы работаем например со словарем, то уже другая ситуация.
d = {'1': 2, '3':4}
def f(a):
        a['1']=1
f(d)
print d
выведет {'1': 1, '3': 4}. Т.е. нужно всегда думать, что мы и куда передаем. В зависимости от типа переменной, можно получить разный результат, при одном и том же коде.

Тварь не знаю, встречал раньше, но сам так не делаю)

tanenn
()
Ответ на: комментарий от tanenn

Ну теперь я разобрался. Global - то что было нужно.) Спасибо.

PS: tvar - TVar - Temporary VARiable, :-).. просто мелкая, особо не нужная, переменная

rip86oz
() автор топика
Ответ на: комментарий от rip86oz

Немножко криво привел примеры) В первом примере мы передаем инт равный 10, а внутри функции исполняя a+=1, создается новый объект и он остается только внутри функции. А во втором примере мы изменяем уже существующий объект, ничего нового мы не создаем и не присваиваем. Т.е. если второй пример переписать так

d = {'1': 2, '3':4}
def f(a):
        a = {'1': 1, '3':4}
f(d)
print d
то изменения переменной d не произойдет, потому что {'1': 1, '3':4} существует только внутри функции. Как-то так, теперь всё :)

tanenn
()
Ответ на: комментарий от rip86oz

Ну и напоследок.

в функцию передаётся «указатель»

В питоне параметры передаются по механизму называемому сall by sharing. Это такой хитрый гибрид.

tanenn
()
Ответ на: комментарий от tanenn

Угу. Благодарю. Можете посоветовать какую-нибудь русскоязычную литературу по питону? Что-б коротко, но ясно - «сухую».

rip86oz
() автор топика
Ответ на: комментарий от rip86oz

Неа, на ангельском читаю. Про тот же сall by sharing по-русски что-то вообще ничего не нашел.

tanenn
()

Ты идиот. Не трогай пистончег.

$ cat test.py #↓
import tmodule

for i in xrange(3):
    tmodule.foo()
$ cat tmodule.py #↓
tvar = 10

def foo():
    global tvar
    print tvar
    tvar += 1
$ python test.py 
10
11
12

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.