問題は、この後です:
samples.append(samples_in)
に新しく追加された値samples
は のコピーではなくsamples_in
、まったく同じ値です。これは、インタラクティブ インタープリターから確認できます。
>>> samples_in = [0]
>>> samples = []
>>> samples.append(samples_in)
>>> samples[-1] is samples_in
True
>>> id(samples[-1]), id(samples_in)
(12345678, 12345678)
インタラクティブなビジュアライザーを使用すると、何が起こっているかをさらに簡単に確認できる場合があります。
したがって、次のように、1 つの名前で値を変更すると、次のようになります。
>>> del samples_in[0:len(samples_in)]
両方の名前で同じ変更が表示されます。
>>> samples[-1]
[]
両方の名前が同じ値を参照していることがわかれば、それは明らかです。
補足として、これらはすでにスライスのデフォルトであるため、 とdel samples_in[:]
まったく同じことを行います。del samples_in[0:len(samples_in)]
2 つの名前で同じ値を参照したくない場合はどうすればよいでしょうか。次に、明示的にコピーを作成する必要があります。
モジュールにはcopy
(ほぼ) 何でもコピーできる関数がありますが、多くの型にはそれを行う簡単な方法があります。たとえばsamples_in[:]
、スライスを 0 から最後までコピーする新しいリストを要求します (これもデフォルトです)。したがって、これを行った場合:
>>> samples.append(samples_in[:])
…あなたは新しい価値を持っているでしょうsamples[-1]
。繰り返しますが、簡単にテストできます。
>>> samples[-1], samples_in
([0], [0])
>>> samples[-1] == samples_in
True
>>> samples[-1] is samples_in
False
>>> id(samples[-1]), id(samples_in)
23456789, 12345678
1 つの値を変更しても、他の値には影響しません。結局のところ、それらは別の値です。
>>> del samples_in[:]
>>> samples[-1], samples_in
([0], [])
ただし、この場合、コピーを作成する必要さえありません。問題が発生している唯一の理由は、何度も再利用しようとしているからですsamples_in
。そんなことをする理由はありませんし、samples_in
毎回新しい値を作成していれば、そもそも問題は発生しなかったでしょう。これの代わりに:
samples_in = []
for k in range(0, qtd_packs):
for n in range(1, size_pack+1):
samples_in.append (pasta[k]+str(n)+'.wav')
samples.append(samples_in)
del samples_in[0:len(samples_in)]
これを行う:
for k in range(0, qtd_packs):
samples_in = []
for n in range(1, size_pack+1):
samples_in.append (pasta[k]+str(n)+'.wav')
samples.append(samples_in)