Python 列表被覆盖?

Python 列表被覆盖?,python,list,overwrite,Python,List,Overwrite,我创建了一个用户定义的指令“getSetpoints”,它通过串行方式读取一组数据,并自动将其分割成4位数的片段,然后转储到名为group#的列表中(取决于用户需要哪一组数据) 所有这些都非常有效,在运行getSetpoints()函数后,我只需键入GROUP0、GROUP1、GROUP2等,就可以在Python shell中打印这些数据,因此我知道这些数据存储正确 但是,现在我想自动将GROUP0列表中的每个成员加载到其正确命名的变量中(即Lang_样式为GROUP0[0],CTinv_符号为

我创建了一个用户定义的指令“getSetpoints”,它通过串行方式读取一组数据,并自动将其分割成4位数的片段,然后转储到名为group#的列表中(取决于用户需要哪一组数据)

所有这些都非常有效,在运行getSetpoints()函数后,我只需键入GROUP0、GROUP1、GROUP2等,就可以在Python shell中打印这些数据,因此我知道这些数据存储正确

但是,现在我想自动将GROUP0列表中的每个成员加载到其正确命名的变量中(即Lang_样式为GROUP0[0],CTinv_符号为GROUP0[1],等等)。我创建了decodeSP()来完成这个任务,我在getSetpoints()的末尾调用它

唯一的问题是,当我在运行getSetpoints()之后在python shell中键入Lang_样式(或任何其他命名变量)时,它只返回一个0。请参阅下面的代码。我还包括了pythonshell的输出

我只是不明白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

按照使用方式,
decodeSP
中的所有变量都声明为本地变量。您希望写入全局,因此需要在函数范围内引用全局。使用
global
关键字实现以下目标:

def decodeSP():
    global Lang_Style
    global CTinv_Sign 
    global Freq
    # ...
    Lang_Style = GROUP0[0]
    CTinv_Sign = GROUP0[1]
    Freq = GROUP0[2]
    # ...

函数
decodeSP
创建了许多与外部变量同名的局部变量。由于您没有返回任何内容,所有这些更改都将丢失。您必须声明所有这些变量
global
,才能影响外部范围

考虑到由此产生的重复量,另一个选项是使用
集合
模块中的
namedtuple

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

这是由于更改对象的值与调用对象上的方法之间存在差异:

当你这样做的时候

RESULTS[group][n] = temp[2+n*6:6+n*6]
Lang_Style = GROUP0[0]
实际上,您在结果上调用了一个方法(
\uuuuuu setitem\uuuuu
)。上述说明扩展至:

RESULTS.__getitem__(group).__setitem__(n, temp.__getslice__(2+n*6, 6+n*6))
您不需要显式更改
结果
,只需对其调用方法,由对象自行修改

相反,当你这样做的时候

RESULTS[group][n] = temp[2+n*6:6+n*6]
Lang_Style = GROUP0[0]
语言风格
设置为'GROUP0[0]

不过,这并不能完全回答这个问题。你的问题是:为什么不坚持?好的,Python可以从上层名称空间(例如,
decodeSP
函数中的全局名称空间)获取值,但它不会覆盖它们

您可以通过在
decodeSP
的开头指定哪些对象应被视为全局对象来改变这一点。看

e、 g


是的,但我不明白
code
RESULTS[group][n]=temp[2+n*6:6+n*6]#去掉空格和x,只留下4位数字与我在decodeSP()中在本地声明它们有什么不同,但GLOBAL0的行为似乎已经是全局的。编辑:Deubeuliu为我回答了上述问题。如果你不知道…我本周刚开始使用Python哈…那行代码是从
RESULT
读取的,显然它得到了组的第个元素。然后通过在loopYay中依次设置一个数组条目来修改此返回值!谢谢你解释这两者的区别。:)