Найти - Пользователи
Полная версия: Странности в поведении с переменными.
Начало » Python для новичков » Странности в поведении с переменными.
1
rip86oz
Основная программа:

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

ЗЫ. Насколько понимаю, используя изменяемые объекты (вроде листов, классов и т.п.), проблема отпадает, т.к. в функцию передаётся “указатель”, и соответсвенно по указателю можно изменять значение. Это так?
ZAN
rip86oz
Допустим в главном файле у меня есть переменная ТВАР. В модуле тоже ТВАР. Они разные. Если я буду использовать ГЛОБАЛ ТВАР в функции модуля - то какую переменную “получу”?
Переменную модуля.
Чтобы менять переменную внутри модуля из другого файла, нужно делать так:
import module
module.tvar = "new value"
А вообще рекоммендую почитать начальную документацию по языку - многое станет понятнее.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB