list.append和list.expand新对象复制所有以前的条目python

时间:2017-09-24 20:36:54

标签: python list append

当我将新对象编入索引时,最新添加的对象将复制到列表中之前添加的所有对象。我在RPI3上运行一个小型Python程序,从4个按钮输入。

    full = []
    schedule = ['day', 'activity', 'clock']
    n = 4
    def setDay(x):
        while True:
            input_state18 = GPIO.input(18)
            input_state23 = GPIO.input(23)
            input_state24 = GPIO.input(24)
            input_state25 = GPIO.input(25)
            if input_state23 == False:
                    print('Monday')
                    time.sleep(0.2)
                    x[0] = 'Monday'
                    break
            if input_state18 == False:
                    print('Tuesday')
                    time.sleep(0.2)
                    x[0] = 'Tuesday'
                    break
            if input_state24 == False:
                    print('Wednesday')
                    time.sleep(0.2)
                    x[0] = 'Wednesday'
                    break
            if input_state25 == False:
                    print('Thursday')
                    time.sleep(0.2)
                    x[0] = 'Thursday'
                    break


    def setActivity(x): 
#same as setDay
    def setClock(x):    
#same as setDay                     

    if __name__ == "__main__":
        i = 0
        while i < n:
            setDay(schedule)
            setActivity(schedule)
            setClock(schedule)
            full.insert(i, schedule)
            i += 1
        #put schedule into first spot in total list 
    print(full)

当我运行程序时,我将以下输出到我的终端:

Monday
Study
19:00
Tuesday
Training
17:00
Monday
Swimming
19:00
Thursday
Training
17:00
[['Thursday', 'Training', '17:00'], ['Thursday', 'Training', '17:00'], ['Thursday', 'Training', '17:00'], ['Thursday', 'Training', '17:00']]

所以问题出在主函数的while循环中。我尝试使用list.append,但我得到了相同的输出。如何更改while循环以使添加的列表不替换以前的?

2 个答案:

答案 0 :(得分:0)

列表主要使用引用来处理,因此附加不会复制schedule,它只会附加它的引用。

关于这一点的一个技巧是使用模块副本。

import copy

full.insert(i, copy.deepcopy(schedule))

这仍将附加引用,但是对复制的对象的引用。 在这种情况下,这应该可以帮助你

答案 1 :(得分:0)

此代码需要进行大量清理。但现在最简单的方法是让它运行以便获得所需的输出:

 while i < n:
        # Defined within the while loop
        schedule = ['day', 'activity', 'clock']
        setDay(schedule)
        setActivity(schedule)
        setClock(schedule)
        full.insert(i, schedule)

因为,现在您再次将相同的列表引用传递给函数,并将相同的列表附加到full列表。相反,每次您应该添加到full时都需要新的列表元素。