1

非常に初心者の質問ですが、それは私を怒らせています。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))

しかし、それは私が望むオブジェクトを参照するのではなく、それらの文字列を追加するだけです。私が考えることができる構文の必要な順列を試しましたが、それでも私をほのめかしています! ありがとう。

4

4 に答える 4

3

そもそもオブジェクトを変数に格納しないでください。それらをリストに直接保存すると、整数でインデックスを付けることができます。

整数識別子がまばらな場合は、整数でdictインデックス付けされたものを使用してください。

于 2012-11-17T20:50:04.290 に答える
2

そもそもこれらをdictに保存することをお勧めします。名前で参照するのとほぼ同じ効果ですが、それぞれに明示的なオブジェクトシンボルがありません。

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

これは、作成するオブジェクトの数が動的であり、後で名前でそれらを取得できるようにする場合に推奨されるアプローチです。名前空間を乱雑にすることなく、これらの数百を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のコメントで述べたように、アイテムを検索できるように文字列IDを使用する必要がなく、アイテムが番号で純粋に連続している場合は、これと同じアプローチを使用できますが、リストを使用できます。それはあなたのニーズに依存します。

次のようなことをしたいと思うかもしれません。

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

...これにより、これらのサウンドの連続したサブセットを検索できるようになります。

于 2012-11-17T20:51:32.173 に答える
0

locals()マッピングから変数を動的にロードできます。

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

一般的に、あなたはそのようなトリックを避けたいです。sampleたとえば、マッピングやリストなど、変数を格納する他の方法を見つけます。

于 2012-11-17T20:46:50.900 に答える
-2

間違ったアプローチのように見えますが、それでも。

sample_list = [eval('sample' + str(i)) for i in range(1, 4)]
于 2012-11-17T21:22:20.537 に答える