函数中未定义的python变量

时间:2018-09-19 19:55:51

标签: python variables

我需要一些有关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 :(得分:3)

这是相关的全局,局部变量类型。您可以在这里https://www.programiz.com/python-programming/global-keyword进行解释。

您只需要将“状态”定义为全局状态。

答案 1 :(得分:1)

一种解决方案是引入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

祝你好运!

答案 2 :(得分:1)

您应该学会切出代码的一部分并简化它,而不会丢失错误。这样,您将确定错误。

最终,您将得到如下代码:

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

答案 3 :(得分:1)

避免实施需要直接访问Global变量的解决方案。一种方法是在可能的情况下更改为更好的数据结构。 您可以将状态定义为listdict(我更喜欢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}