переменная python не определена внутри функции - PullRequest
0 голосов
/ 19 сентября 2018

Мне нужна помощь с переменными python.У меня есть эскиз, который отправляет переменные в функцию под названием roomControl.Если во время этой функции статус изменился с предыдущего раза, то я хочу, чтобы он что-то сделал.В настоящее время он должен распечатать значения переменных.

Я получаю сообщение об ошибке, что переменная состояния не была назначена, и я полагаю, что это происходит из-за того, что она установлена ​​вне функции.Но если я установлю переменную внутри функции, это переопределит функции управления этими переменными.(надеюсь, это имеет смысл)

Мой сценарий приведен ниже, но в основном, если статус меняется, распечатайте что-то, чего я пытаюсь достичь

import MySQLdb

status = 0
previousStatus = 0

connSolar = MySQLdb.connect("localhost", "######", "#######", "######") 
cursSolar = connSolar.cursor()

def roomControl(name, demand, thermostat, roomTemp):
    if demand == 1 and thermostat > roomTemp:
        status = 1
    if demand == 1 and thermostat < roomTemp:
        status = 0
    if demand == 0:
        status = 0
    if (status == 1 and previousStatus == 0):
        print("Room: %s, Heating demand = %s, Thermostate = %s, Room Temp = %s, Status = %s") % (name, demand, thermostat, roomTemp, status)
        print("")
    previousStatus = status
    return (status)     

while 1:
    Ntemp = 25
    try:
        cursSolar.execute ("SELECT * FROM roomHeatingControl")
        connSolar.commit()
        for reading in cursSolar.fetchall():
            Nthermostat = reading[6]
            NSW = reading[7]
    except (MySQLdb.Error, MySQLdb.Warning) as e:
        print (e)   
    NPy_status = roomControl('Niamh', NSW, Nthermostat, Ntemp)

Ответы [ 4 ]

0 голосов
/ 19 сентября 2018

Избегайте реализации решения, где вам нужен прямой доступ к глобальным переменным.Один из способов - перейти на лучшую структуру данных, где это возможноВы можете определить свои статусы как list или dict (я бы предпочел dict), и вы можете получить к ним доступ непосредственно внутри функции, не передавая их.Вот небольшой пример, чтобы прояснить ситуацию

d={'status':0, 'prev_status':0} # Intialize the dict
def myfunc():
    d['status']=5 # make modifications
myfunc()
print(d) # {'status': 5, 'prev_status': 0}
0 голосов
/ 19 сентября 2018

Решение состоит в том, чтобы ввести status как глобальное.

status = 0
previousStatus = 0
# other code
def roomControl(name, demand, thermostat, roomTemp):
    global status
    global previousStatus
    #  This will bring in both variables to be edited within the function

Удачи!

0 голосов
/ 19 сентября 2018

Вы должны научиться вырезать кусочки вашего кода и упростить его, не теряя ошибки.Таким образом вы исправите ошибку.

В конечном итоге вы получите такой код:

status = 0

def f():
    print(status)

f()
Out: 0

Как и ожидалось, функция не может найти status, поэтому она выглядитв глобальной области видимости находит и печатает.

status = 0

def f():
    status = 1
    print(status)

f()
Out: 1

Снова, как и ожидалось.Мы определили локальную переменную status для f, поэтому f просто использует ее при печати. ​​

status = 0

def f():
    print(status)
    status = 1

f()
UnboundLocalError: local variable 'status' referenced before assignment

Теперь становится понятно, почему произошла ошибка.Единственное отличие от второго примера состоит в том, что мы поменяли порядок так, что status определяется в f только после того, как он используется в print, и единственное отличие от первого примера состоит в том, что мы определяем status внутри f.Так вот в чем проблема: когда мы определяем переменную внутри функции - в любом месте внутри функции - Python решает, что эта переменная должна быть локальной для функции.Поэтому, когда он попадает в функцию print, он ищет локальную переменную status, но она еще не была определена.Отсюда и ошибка.Аналогично, если вы запустили этот код:

print(status)
status = 1
NameError: name 'status' is not defined
0 голосов
/ 19 сентября 2018

Это связанные глобальные типы локальных переменных.Вы можете найти здесь https://www.programiz.com/python-programming/global-keyword объяснение.

Вам нужно только определить «статус» как глобальный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...