我想生成一个包含全局变量的子部分名称的字符串列表 (MEM_strings),列表中字符串的位置必须与变量的值相对应(例如 MEM_ALARM = 20 所以 MEM_STRINGS[20] =“MEM_ALARM”)。我的起始代码是:
MEM_strings = [False] * 71
for var_name, var_value in (list(globals().items())[29:]):
MEM_strings[var_value] = var_name
这会抛出:“列表索引必须是整数或切片,而不是列表”,同时突出显示第 3 行将 var_value 用作索引。
为了找出我尝试过的问题......
print(f"{var_name}:{var_value}:{type(var_value)}")
我得到:
MEM_FIRMWAREVERSION_MAJOR:0:<class 'int'>
MEM_FIRMWAREVERSION_MINOR:1:<class 'int'>
MEM_SERVOVERSION_MAJOR:3:<class 'int'>
MEM_SERVOVERSION_MINOR:4:<class 'int'>
# etc...
var_value 看起来像是一个 int!
我尝试将其转换为 int,然后将其用作赋值中的索引,它再次抱怨它是一个列表:“int() 参数必须是字符串、类似字节的对象或实数,而不是 '列表'"
好吧,如果你说你是一个名单,我会像对待一个名单一样对待你(我认为这不会起作用,我只是想看看它做了什么):
MEM_strings = [False] * 71
for var_name, var_value in (list(globals().items())[29:]):
MEM_strings[var_value[0]] = var_name
此时它抱怨:“‘int’对象不可下标”引用 [0]。
总而言之,当我尝试将其视为 int 时,var_value 说它是一个列表,而当我尝试将其视为列表时,var_value 说它是一个 int。我怀疑我错过了用“list(globals().items())”生成的列表的确切结构,或者错误地处理了它的元素(我相信每个元素将是一个元组)。我很困惑,因为打印语句的输出似乎表明我的代码应该按预期工作。
你写了一个循环。有多个
var_value
值需要处理。其中一些是整数,但是这个全局变量:
MEM_strings = [False] * 71
存储一个列表,因此
var_value
的值之一就是这个列表。
你正在做的整个
list(globals().items())[29:]
事情是个坏主意。正如您所看到的,很容易意外地选择您不想要的变量。它也非常脆弱,将代码的行为与您定义的全局变量的确切数量以及定义它们的确切顺序联系在一起。