Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 20, 2011 13:10:01

rip86oz
От:
Зарегистрирован: 2011-03-14
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Странности в поведении с переменными.

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

import sc

while True:
sc.tst()
Модуль sc:

tvar = 10

def tst():
print(tvar)
#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 не помогает, да и не нужно. Помог только вариант с присвоением пременной и передачей значения в функцию из основной программы.
Есть-ли другие способы? Т.к. это ужасный костыль.
Надо чтобы функции в модуле могли сами присваивать новые значения внутренним переменным модуля.



Отредактировано (Апрель 20, 2011 13:14:01)

Офлайн

#2 Апрель 20, 2011 13:28:47

ZAN
От:
Зарегистрирован: 2007-06-10
Сообщения: 403
Репутация: +  10  -
Профиль   Отправить e-mail  

Странности в поведении с переменными.

Перед тем, как вызывать функцию, питон пробегается по переменным и проверяет, есть ли присваивания переменной.
Если присвоения нет или же использован модификатор global, то переменная трактуется, как глобальная.

def tst():
print(tvar)
В примере выше присвоения внутри функции нит и tvar интерпретируется, как глобальная.

А в следующем примере присвоение есть, поэтому tvar считается локальной, при чем во всей функции, а не только до вызова tvar += 1. Отсюда и ошибка.
def tst():
print(tvar)
tvar += 1
Глобал как-раз таки поможет
tvar = 1
def tst():
global tvar
print(tvar)
tvar += 1
Но вообще говоря, использование глобальных переменных не очень-то хорошо, разве что в качестве каких-то конфигураций, особенно в случае небольшого скриптика, когда дальнейшее развитие программы особо не предусматривается.



Отредактировано (Апрель 20, 2011 13:30:53)

Офлайн

#3 Апрель 20, 2011 13:39:20

rip86oz
От:
Зарегистрирован: 2011-03-14
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Странности в поведении с переменными.

Допустим в главном файле у меня есть переменная ТВАР. В модуле тоже ТВАР. Они разные. Если я буду использовать ГЛОБАЛ ТВАР в функции модуля - то какую переменную “получу”?
Вообще подразумевает расширение программы (здесь пример - проблему “высосал”), и будет много модулей у которых возможно будут одинаковые внутренние переменные, которые должны менятся непостредственно функциями этих модулей.
За помощь большое спасибо.

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



Отредактировано (Апрель 20, 2011 13:43:32)

Офлайн

#4 Апрель 20, 2011 17:21:24

ZAN
От:
Зарегистрирован: 2007-06-10
Сообщения: 403
Репутация: +  10  -
Профиль   Отправить e-mail  

Странности в поведении с переменными.

rip86oz
Допустим в главном файле у меня есть переменная ТВАР. В модуле тоже ТВАР. Они разные. Если я буду использовать ГЛОБАЛ ТВАР в функции модуля - то какую переменную “получу”?
Переменную модуля.
Чтобы менять переменную внутри модуля из другого файла, нужно делать так:
import module
module.tvar = "new value"
А вообще рекоммендую почитать начальную документацию по языку - многое станет понятнее.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version