Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python list append()的奇怪行为_Python_List_Dictionary - Fatal编程技术网

Python list append()的奇怪行为

Python list append()的奇怪行为,python,list,dictionary,Python,List,Dictionary,我试图从一个文本文件中识别一组单词,这些单词在任何一个文本文件中至少出现了若干次。我有一张保留限定词的列表。文件逐行读取。在每一行中,出现在该行中的单词及其计数都被放入词典中。计数数大于阈值的单词将追加到列表中。在单行上运行的代码如下所示(我对一些与问题无关的部分进行了伪编码): 在每一行的结尾,我都希望清空字典,不要在字典里放无用的内容。但是,我现在在#后面放的那一行:dict.clear()会删除列表的内容,并在最后一行中只保留限定词。当这一行被删除时,输出是正确的 有人能解释一下为什么会这

我试图从一个文本文件中识别一组单词,这些单词在任何一个文本文件中至少出现了若干次。我有一张保留限定词的列表。文件逐行读取。在每一行中,出现在该行中的单词及其计数都被放入词典中。计数数大于阈值的单词将追加到列表中。在单行上运行的代码如下所示(我对一些与问题无关的部分进行了伪编码):

在每一行的结尾,我都希望清空字典,不要在字典里放无用的内容。但是,我现在在
#
后面放的那一行:
dict.clear()
会删除列表的内容,并在最后一行中只保留限定词。当这一行被删除时,输出是正确的

有人能解释一下为什么会这样吗?list类的append()方法是本地复制数据还是只维护一个指针?dictionary clear()方法是否不仅释放dict对键值对的引用,而且释放其他对象对键值对的引用

@编辑:为了处理一些注释,每行中的单词提取都是伪代码。我认为这一步与问题无关。如果你们感兴趣,这里是原始代码。
该代码查找长序列中频繁出现的短DNA片段。示例数据可通过此链接下载:

使用链接数据集尝试链接代码表明,您只获得一组对
kmers
的更新,因为最外层的
for
循环只运行一次

这是由于您正在使用的
range
调用:
range(range(0,len(genome)-L+1,L-k)
。在示例数据中,
len(genome)
100
L
75
k
5
。这意味着您的范围是
range(0,26,70)
,这只产生
0
(下一个值将是
70
,远大于
26
的上限)


我很确定您不想将
L-k
步骤参数指定给
range
。如果您将循环代码更改为使用
range(len(genome)-L+1)
,您将在
kmers
中获得预期结果:
['CGACA',GAAGA',AATGT']

使用python关键字作为变量不是一个好主意。我的意思是,你不应该使用
list
dict
作为变量。
dict
对象和
list
对象除了不可变的字符串对象之外没有任何共同点。请检查你是否正在执行类似
list=[]
在代码中的某个地方,或者提供最小的可复制示例。很抱歉,原始代码没有
列表
dict
作为变量。在这里犯了一个愚蠢的错误。此外,使用for循环迭代字符串将在每次迭代中给出单个字符,而不是单词。我不明白为什么要删除该措辞在每一行的末尾加上一个ary。可能您希望计算多行中的单词以达到阈值。如果您试图提高效率,那么您肯定不希望每一行都遍历字典。此伪代码将很难确定出现了什么问题。
words = []
candidates = {}

for line in text: 
    for word in line:
        if word in dict:
            candidates[word] += 1
        else
            candidates[word] = 1
    for word in candidates:
        if candidates[word] > threshold:
            if word not in words:
                words.append(word)
    # candidates.clear()