首页 > 解决方案 > 使用 for 循环将函数输出分配给列表中的变量

问题描述

我认为我的问题应该很常见,但我在网上找不到答案。我有一个接受 2 个参数并有 2 个输出的函数。我想通过函数运行这两个参数的列表,并将输出分配给列表中的元素。让我解释一下,这两个参数在这两个列表中:

Lengths = [self.xS, self.yS, self.zS, self.Len1, self.Len2, self.Thick]
LengthsUnit = [self.xSUnit, self.ySUnit, self.zSUnit, self.Len1Unit, self.Len2Unit, self.ThickUnit]

我为通过函数运行这些参数而构建的for循环如下所示:

for length, unit in zip(Lengths, LengthsUnit):
    length, unit = ConvertToSIVarUnit(self, length, unit, 'meter', 'Length')

完成后,我希望self.xS修改列表中的内容(以示例为例)。所以第一个打印语句的输出应该和最后一个不同:

Lengths = [self.xS, self.yS, self.zS, self.Len1, self.Len2, self.Thick]
LengthsUnit = [self.xSUnit, self.ySUnit, self.zSUnit, self.Len1Unit, self.Len2Unit, self.ThickUnit]

print(self.Xs)

for length, unit in zip(Lengths, LengthsUnit):
    length, unit = ConvertToSIVarUnit(self, length, unit, 'meter', 'Length')

print(self.xS)

但是这 2 个print函数的输出是相同的,所以 for-loop-function 组合可能不起作用。

标签: pythonpython-3.xlistfunctionfor-loop

解决方案


您需要分配给列表元素,而不是保存列表值的变量。用于enumerate()获取索引。

for i, (length, unit) in enumerate(zip(Lengths, LengthsUnit)):
    Lengths[i], LengthsUnit[i] = ConvertToSIVarUnit(self, length, unit, 'meter', 'Length')

但是,如果您不将长度和单位保留在不同的列表中,事情可能会更容易。使用字典或元组列表将值和单位保持在一起。

更改列表以影响原始对象属性是不可能的。您可以使用属性名称列表而不是值,然后使用getattr()and setattr

Lengths = ['xS', 'yS', 'zS', 'Len1', 'Len2', 'Thick']
LengthsUnit = ['xSUnit', 'ySUnit', 'zSUnit', 'Len1Unit', 'Len2Unit', 'ThickUnit']
for length, unit in zip(Lengths, LengthsUnit):
    new_length, new_unit = ConvertToSIVarUnit(self, getattr(self, length), getattr(self, unit), 'meter', 'Length')
    setattr(self, length, new_length)
    setattr(self, unit, new_unit)

print(self.xS)

推荐阅读