gpt4 book ai didi

python - 列表项在我追加到列表后消失

转载 作者:太空宇宙 更新时间:2023-11-03 15:06:34 25 4
gpt4 key购买 nike

我简化了列表以便更好地理解。我有一个动态变化的列表(比方说):

recPkt = [10, 1, 38, 64]

并且想要检查列表是否与列表中的某个列表匹配(如下所示)。此列表列表是从 txt 文件中读取的。

mDdata = [[10, 1, 37, 6], '|', [10, 1, 37, 64], '|', [10, 1, 37, 45], '|', [10, 1, 37, 51]]

如果列表不在里面,我想将它 append 到列表列表 (mDdata) 中。

我的问题是当我追加时。更新的列表未正确保存。列表中的所有列表都是相同的,只有最后一个列表不同或者空列表被 append (取决于我放置 pcktLst [:] = [] 的位置)

if isDev == 1: #device is on list
devdata = []
devdata [:] = []
pcktLst = []
pcktLst [:] = []
ind = myReadList.index(devAddr+"-END"+"--------------------------------------------")
devdata = myReadList [iJ + 10: ind]
devdata = str(devdata)
x = devdata.find("(")
y = devdata.find(")")

devdata = devdata[(x+1):(y)]
devdata = devdata.split('|')

mDdata = []
mDdata [:] = []
s = 0
devLst = []
devLst [:] = []
dd = readDtoL(devdata) #returns list of list of existing data in txt file

count = 0


for eaItm in dd:
eaItm = eaItm.replace("[","")
eaItm = eaItm.replace("]","")
eaItm = eaItm.split(", ")

pcktLst [:] = []
print eaItm
print dd
for eaNumb in eaItm:
print eaNumb
eaNumb = int(eaNumb)
pcktLst.append(eaNumb)

devLst = pcktLst
if count == 0 :
mDdata.append(devLst)
print mDdata

elif count > 0:
mDdata.append("|")
mDdata.append(devLst)
print "Count"
print mDdata
count+=1
pcktLst [:] = []

bla = []
bla [:] = []
for eNumb in recPkt:
#print eNumb
eNumb = int(eNumb)
bla.append(eNumb)

print bla
#print mDdata
if (bla in mDdata) == False:
mDdata.append("|")
mDdata.append(bla)
print "TOLE JE PO APPEND"
print mDdata

我最好的猜测是我应该有一些温度。变量或将列表更改为元组。

最佳答案

我认为导致您出现问题的部分是 -

devLst =  pcktLst
if count == 0 :
mDdata.append(devLst)
print mDdata

elif count > 0:
mDdata.append("|")
mDdata.append(devLst)
print "Count"
print mDdata
count+=1
pcktLst [:] = []

当你这样做时——

devLst = pcktLst

您只是将 pcktLst 的引用分配给 devLst,它们都引用同一个列表。当您这样做时 - mDdata.append(devLst) - 您将该列表引用 append 到列表 mDdata 中。

然后当你这样做时——

pcktLst [:] = []

此就地清除 pcktLst 引用的列表,它也是列表 devLst 以及您刚刚 append 到 mDdata 的 lsit。你不应该那样做。一个非常简短的例子来展示这种行为 -

>>> a = [1,2]
>>> b = a
>>> c = []
>>> c.append(a)
>>> c
[[1, 2]]
>>> b
[1, 2]
>>> a
[1, 2]
>>> a[:] = []
>>> a
[]
>>> b
[]
>>> c
[[]]

我猜你对 [:] 有某种错误的理解,当在赋值运算符的左侧使用切片时,你是在要求 python 就地改变列表,这会反射(reflect)在列表中引用的所有名称中。你应该使用它,除非你真的需要就地变异,我认为没有任何必要。你可以这样做 -

pcktLst = []

这会导致 pcktList 指向一个新的列表,而不会对它之前指向的列表造成任何问题。你应该在任何地方都这样使用它。


另外,当你这样做时——

mDdata = []
mDdata [:] = []
s = 0
devLst = []
devLst [:] = []

这没有任何好处,你可以写 -

mDdata = []
s = 0
devLst = []

关于python - 列表项在我追加到列表后消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31985606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com