问题是在此之后:
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)
使用交互式可视化器可能更容易看到正在发生的事情。
因此,当您通过一个名称修改值时,如下所示:
>>> del samples_in[0:len(samples_in)]
通过两个名称可以看到相同的修改:
>>> samples[-1]
[]
一旦您意识到两个名称都指代相同的值,那应该是显而易见的。
作为旁注,del samples_in[:]
会做与 完全相同的事情del samples_in[0:len(samples_in)]
,因为这些已经是切片的默认值。
如果您不希望这两个名称引用相同的值怎么办?然后你必须明确地制作一个副本。
该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
而且,如果您更改一个值,则不会影响另一个值——毕竟,它们是单独的值:
>>> 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)