当我将新对象编入索引时,最新添加的对象将复制到列表中之前添加的所有对象。我在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循环以使添加的列表不替换以前的?
答案 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
时都需要新的列表元素。