奇怪的"继承"变量之间的联系

时间:2015-11-01 18:02:56

标签: python

我正在尝试编写一个函数,该函数将对列表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上执行的操作,有没有比将其复制到元组更好的方法呢?

为新生儿提前道歉,我努力尝试通过谷歌回答这个问题,但我不确定我是否正确地提出这个问题。

1 个答案:

答案 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