变量之间联系的奇数"inheritance"



我正在尝试编写一个函数,该函数将对列表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

最新更新