我需要一些有关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)
答案 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变量的解决方案。一种方法是在可能的情况下更改为更好的数据结构。
您可以将状态定义为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}