我创建了一个用户定义的指令'getSetpoints',它通过串行读取一组数据并自动将其切换成4位数的片段,这些片段被转储到名为GROUP#的列表中(#取决于哪个数据组,用户希望)。
所有这些都很好用,我只需键入GROUP0,GROUP1,GROUP2等就能在Python shell中打印这些数据。运行getSetpoints()函数后,我知道它存储正确。< / p>
但是,现在我想自动将GROUP0列表中的每个成员加载到其正确命名的变量中(即.Lang_Style为GROUP0 [0],CTinv_Sign为GROUP0 [1]等)。我创建了decodeSP()来执行此操作,我在getSetpoints()的末尾调用它。
唯一的问题是,当我在运行getSetpoints()之后在python shell中键入Lang_Style(或我的任何其他命名变量)时,它只返回0.请参阅下面的代码。我也包含了我的Python shell的输出。
我只是不明白GROUP0在用户定义的指令执行后如何保留其数据,但每次其他变量都设置为零。就我所见,这是完全相同的。
# Define Variables (This is shortened to only show one GROUP...)
GROUP0 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Lang_Style = 0
CTinv_Sign = 0
Freq = 0
PT_Ratio = 0
CT_Ratio = 0
DST = 0
System_Volts = 0
Gen_Phase = 0
Op_Mode = 0
Seq_Pref = 0
Re_Commit = 0
Bit_Address = 0
CRLF = bytearray ([0x0D, 0x0A])
RESULTS = [GROUP0, GROUP1, GROUP2, GROUP3, GROUP4, GROUP5]
def getSetpoints(group):
if 0 <= group <= 5:
# Send out the command for Display Setpoint, then group number, then CRLF.
s = serial.Serial('COM1', '9600') # serial port, baud rate
s.write("DP")
s.write(group)
s.write(CRLF)
temp = s.read(len(RESULTS[group])*6) # Each setpoint is 6 characters (space + x + 4 digits).
n = 0
for n in range(len(RESULTS[group])):
# RESULTS[group][n] = int(temp[2+n*6:6+n*6],16) # Use this one if you want Integers
RESULTS[group][n] = temp[2+n*6:6+n*6] # Cut out the space and the x, leaving only the 4 digits.
print RESULTS[group] # Debug Print
s.close()
decodeSP()
return
else:
print 'Invalid Group Number'
return
def decodeSP():
Lang_Style = GROUP0[0]
CTinv_Sign = GROUP0[1]
Freq = GROUP0[2]
PT_Ratio = GROUP0[3]
CT_Ratio = GROUP0[4]
DST = GROUP0[5]
System_Volts = GROUP0[6]
Gen_Phase = GROUP0[7]
Op_Mode = GROUP0[8]
Seq_Pref = GROUP0[9]
Re_Commit = GROUP0[10]
Bit_Address = GROUP0[11]
return
Python Shell输出:
================================ RESTART ================================
getSetpoints(0)
['0004', '0000', '003C', '0000', '00C8', '0001', '0078', '0101', '0000', '0003', '0001', '0001']
GROUP0
['0004', '0000', '003C', '0000', '00C8', '0001', '0078', '0101', '0000', '0003', '0001', '0001']
Lang_Style
0
答案 0 :(得分:1)
您使用它的方式,decodeSP
中的所有变量都声明为本地变量。您想要写入全局,因此您需要在函数范围内引用全局。使用global
关键字来实现:
def decodeSP():
global Lang_Style
global CTinv_Sign
global Freq
# ...
Lang_Style = GROUP0[0]
CTinv_Sign = GROUP0[1]
Freq = GROUP0[2]
# ...
答案 1 :(得分:1)
您的函数decodeSP
创建了许多与外部变量具有相同名称的局部变量。由于您没有返回任何内容,因此所有这些更改都将丢失。您必须声明所有这些变量global
才能影响外部范围。
考虑到重复的结果,另一个选项是使用namedtuple
模块中的collections
from collections import namedtuple
data = namedtuple('data', 'Lang_Style, CTinv_Sign, Freq, PT_Ratio, CT_Ratio, DST, System_Volts, Gen_Phase, Op_Mode, Seq_Pref, Re_Commit, Bit_Address')
parsed_data = data(*GROUP0) # need to fill in the array as params
然后,您可以
访问数据print parsed_data.Lang_Style
答案 2 :(得分:1)
这是由于更改对象值和调用方法之间的区别:
当你做
时RESULTS[group][n] = temp[2+n*6:6+n*6]
你实际上在结果上调用了一个方法(__setitem__
)。上述说明扩展为:
RESULTS.__getitem__(group).__setitem__(n, temp.__getslice__(2+n*6, 6+n*6))
您没有明确更改RESULTS
,只需在其上调用方法即可自行修改对象。
相反,当你做
时Lang_Style = GROUP0[0]
你设置 Lang_Style
为`GROUP0 [0]。
但这并没有完全回答这个问题。你的问题是:它为什么不坚持?好吧,Python可以从上层命名空间获取值(例如decodeSP
函数中的全局命名空间),但它不会覆盖它们。
您可以通过在decodeSP
的开头指定哪些对象应被视为全局来更改它。见http://docs.python.org/release/2.7/reference/simple_stmts.html#the-global-statement
e.g。
def decodeSP():
global Lang_Style, CTinv_Sign, ...