变量间联系的奇数“继承”

2024-10-06 11:20:25 发布

您现在位置: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执行的操作,有没有比将其复制到元组更好的方法呢

提前为我的新观点道歉,我试图通过谷歌回答这个问题,但我不确定我问的问题是否正确


Tags: 函数列表inputstep成员processlistprint
1条回答
网友
1楼 · 发布于 2024-10-06 11:20:25

列表是可变的。创建对列表的新引用时,并不是在创建新列表。创建列表的元组可以满足您的需要,因为元组是不可变的,所以您不会创建新的引用。另一种方法是使用list的copy()方法或slice[:]

k = [1, 2, 3]
k2 = k  # reference to k
k3 = k.copy()  # a copy of k
k4 = k[:]  # also a copy of k

相关问题 更多 >