将顺序对象添加到列表的语法



这个问题很初级,但它让我抓狂。sample1、sample2等是Pygame.mixer.sound对象。

sample_list = []
sample_list.append(sample1)
sample_list.append(sample2)
sample_list.append(sample3)

很好,但我想使用for样式循环来完成,例如

for j in range(1, 3, 1):
sample_list.append(sample + j)

但这是试图给一个声音对象添加一个数字,所以这是不对的。我可以通过添加等效字符串;

for j in range(1, 3, 1):
sample_list.append("sample" + str(j))

但这并不是指我想要的对象,只是添加了那些字符串。我已经尝试了我能想到的语法的必须排列,但它仍然在暗指我!谢谢

首先不要将对象存储在变量中;将它们直接存储到列表中,然后您就可以按整数对它们进行索引。

如果整数标识符是稀疏的,请使用按整数索引的dict

我建议首先将这些存储在dict中。通过名称引用几乎是相同的效果,但没有每个名称的明确对象符号:

samples = {
"sample1": Sample(),
"sample2": Sample()
}
samples['sample3'] = Sample()

当您有一个动态数量的对象正在创建,并且希望以后能够通过名称获取它们时,这是首选的方法。您可以将其中的100个存储在dict中,而不会弄乱您的命名空间。

稍后,如果您试图将其应用于循环,则可以引用字符串名称:

for i in xrange(1,4):
sample_list.append(samples["sample" + str(i)])

顺便说一句,当属性位于某个对象上时,另一种按名称获取属性的方法是使用getattr。假设你有这个:

class Sampler(object):
pass
sampler = Sampler()
sampler.sample1 = Sample()
sampler.sample2 = Sample()
sampler.sample3 = Sample()

然后,您可以通过getattr(sampler, "sample1")按名称引用

注意:正如@Marcin在评论中提到的,如果你不在乎有一个字符串标识符来查找你的物品,而且它们只是纯粹按数字顺序排列的,你可以使用同样的方法,但要使用列表。这取决于你的需要。

你可能最终想做这样的事情:

samples = {
"bang1": Sample(),
"bang2": Sample(),
"bang3": Sample(),
"shot1": Sample(),
"shot2": Sample(),
...
}

这将允许您查找这些声音的顺序子集。

您可以从locals()映射动态加载变量:

for j in range(1, 4):
sample_list.append(locals()["sample" + str(j)])

一般来说,你要避免这种伎俩;找到其他方法来存储sample变量,例如在映射或列表中。

看起来是错误的方法,但无论如何。

sample_list = [eval('sample' + str(i)) for i in range(1, 4)]

最新更新