1
qtd_packs = 2
size_pack = 16
pasta = []
pasta.append ('packs/krun/')
pasta.append ('packs/parting2/')

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)]


print(samples)

私は基本的に、リスト内にを追加してから、古いリストを削除して新しいリストを作成しようとしsamples_inいます。これは. しかし、最終的に得られるのは 2 つの空のリストです。samples samples_inqtd_packs =2

[[], []]

削除する前に内部をappend編集しました。どうしたの?samples_insamples

ありがとうございました

4

3 に答える 3

2

Python では、リストは参照によって渡されます。に追加samples_inするとsamples、Python は への参照をsamples_inに追加しsamplesます。samples_inのコピーをtoに追加する場合は、次のようsamplesにします。

samples.append(samples_in[:])

これにより、 のすべての項目から新しいリストが効果的に作成され、samples_inその新しいリストが に渡されsamples.append()ます。したがって、 のアイテムをsamples_inクリアしても、追加されたリストのアイテムはクリアされませんsamples

samples_in[:]また、は と同等であることに注意してくださいsamples_in[0:len(samples_in)]

于 2013-08-15T23:25:47.663 に答える
1

問題は、この後です:

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)
于 2013-08-16T00:21:35.653 に答える