我正在尝试编写一个函数,该函数将对列表input
的每个成员执行迭代操作,然后删除该成员。尽管这对我粘贴在下面的极简主义代码来说没有意义,但我希望函数通过对照原始input
列表检查其操作的乘积来结束——因此,函数的第一步创建了一个列表originals = input
,该列表旨在保留这个起始列表,以便在最后进行检查。
这是我的功能的最低版本:
def process(input):
originals = tuple(input)
members = []
print('Step 0nOriginals: {}nList: {}nMembers: {}'.format(originals,input,members))
step = 0
while len(input)>0:
step += 1
members.append(input[0])
input.remove(input[0])
print('nStep {}nOriginals: {}nList: {}nMembers: {}'.format(step,originals,input,members))
可以看出,我一开始创建了originals
,然后在剩下的时间里不碰它。然而,当我调用process(['a','b','c'])
时,输出是:
Step 0
Originals: ['a', 'b', 'c']
List: ['a', 'b', 'c']
Members: []
Step 1
Originals: ['b', 'c']
List: ['b', 'c']
Members: ['a']
Step 2
Originals: ['c']
List: ['c']
Members: ['a', 'b']
Step 3
Originals: []
List: []
Members: ['a', 'b', 'c']
按照预期,该函数将input
的每个元素依次移动到新列表member
,但同时将它们从originals
中删除。据推测,这反映了当我进行最初的originals = input
分配时,在列表之间建立的某种联系。
如果我使用originals = tuple(input)
,一切都会按预期进行。所以我可以继续我的工作,但我不满意。为什么originals
会经历我在input
上执行的操作,有没有比将其复制到元组更好的方法呢?
提前为新手道歉,我试着通过谷歌回答了这个问题,但我不确定我问的问题是否正确。
列表是可变的。创建对列表的新引用时,并不是在创建新列表。创建列表的元组是您想要的,因为元组是不可变的,您没有创建新的引用。替代方法是使用列表的copy()方法,或切片[:]
k = [1, 2, 3]
k2 = k # reference to k
k3 = k.copy() # a copy of k
k4 = k[:] # also a copy of k