非常初学的问题,但这让我很生气。 sample1,sample2等是Pygame.mixer.sound对象。
sample_list = []
sample_list.append(sample1)
sample_list.append(sample2)
sample_list.append(sample3)
很好,但我想使用for style循环,例如
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))
但是这并没有引用我想要的对象,只是添加了这些字符串。 我已经尝试过我能想到的语法排列,但它仍然暗指着我! 感谢。
答案 0 :(得分:3)
首先不要将对象存储在变量中;将它们直接存储到列表中,然后您就可以用整数对它们进行索引。
如果整数标识符是稀疏的,请使用整数索引的dict
。
答案 1 :(得分:2)
我建议将这些存储在dict中。通过名称引用几乎相同的效果,但每个引用没有明确的对象符号:
samples = {
"sample1": Sample(),
"sample2": Sample()
}
samples['sample3'] = Sample()
当您创建动态数量的对象并希望以后能够通过名称抓取它们时,这是首选方法。你可以在你的dict中存储100个这些,而不会弄乱你的命名空间。
稍后如果您尝试将此应用于循环,则可以引用字符串名称:
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(),
...
}
...然后,您可以查找这些声音的连续子集。
答案 2 :(得分:0)
您可以从locals()
mapping:
for j in range(1, 4):
sample_list.append(locals()["sample" + str(j)])
一般来说,你想避免这种伎俩;找到将sample
变量存储在映射或列表中的其他方法。
答案 3 :(得分:-2)
看起来是错误的做法,但不过。
sample_list = [eval('sample' + str(i)) for i in range(1, 4)]