我正在尝试编写一个函数,该函数将对列表input
的每个成员执行迭代操作,然后删除该成员。虽然这对我在下面粘贴的极简主义代码没有意义,但我希望函数通过检查其操作的产品与原始input
列表来结束 - 因此,第一步该函数创建一个列表originals = input
,用于保留此起始列表,以便在最后进行检查。
这是我的功能的极简主义版本:
def process(input):
originals = tuple(input)
members = []
print('Step 0\nOriginals: {}\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
上执行的操作,有没有比将其复制到元组更好的方法呢?
为新生儿提前道歉,我努力尝试通过谷歌回答这个问题,但我不确定我是否正确地提出这个问题。
答案 0 :(得分:1)
列表是可变的。当您创建对列表的新引用时,您不会创建新列表。制作列表的元组可以实现您想要的,因为元组是不可变的,您不会创建新的引用。替代方法是使用列表的copy()方法或切片[:]
k = [1, 2, 3]
k2 = k # reference to k
k3 = k.copy() # a copy of k
k4 = k[:] # also a copy of k