变量应该是一个int,但AttributeError声称它是一个str

时间:2015-11-21 23:22:24

标签: python python-3.x

Python一直在AttributeError: 'str' object has no attribute 'pop'行上给我一个“Words[Check0n].pop()”。

最初,我试图通过将CheckCheck0转换为int并将ChecknCheck0n等同于此来解决此问题。

由于这不起作用,我使用Check0n两次检查int的值是否为print(type(Check0n) is int)。两个都打印True,所以我真的不明白为什么它会一直给出同样的错误,如果Check0n是一个字符串,它显然不是。

我希望程序做的是测试列表中的“a”。然后,它应该在列表的下一个位置测试“事物”。如果那里有“东西”,那么它应该从列表中的那个位置删除“东西”,并用“一个东西”替换前一个位置中的“a”。如果你输入“一个东西”,我希望那些在列表中保持分开的“a”,“stuff”。

def Sentence_Processing():
    Sentence = input("Enter a sentence:")
    Sentence_0 = Sentence.replace(".", " .")
    Sentence_1 = Sentence_0.replace(",", " ,")
    Words = Sentence_1.split()
    print(Words)
    for Word in Words:
        Word0 = str.lower(Word)
        if Word0 == "a":
            Check = Words.index(Word)
            Check0 = Check+1
            Checkn = int(Check)
            Check0n = int(Check0)
            print(type(Check0n) is int)
            if Words[Check0n] == "thing":
                print(type(Check0n) is int)
                Words[Check0n].pop()
                Words[Checkn] = "a thing"
                print("Did all of it")
            print("Passed")

请注意,该程序对我来说很重要,可以粘贴整个程序。

1 个答案:

答案 0 :(得分:0)

“......如果Check0n是一个字符串,它会一直给出同样的错误......”

不,不是。如果Words[Check0n]是一个字符串,那么它会给你一个错误。 Words是一个字符串列表,Words[Check0n]就是其中之一。

您可以通过拆分问题行来证明这一点:

Words[Check0n].pop()

......分为两个:

oops = Words[Check0n]
print(repr(oops))
oops.pop()

第一行和第二行可以正常工作,您会看到oops是字符串'thing'。然后,您将获得与以前相同的AttributeError,但它会抱怨oops.pop()行。

您的代码还有其他问题:

  1. 你正在从一个集合中删除项目,而“for-each”迭代它,这总是很棘手。这很难说,因为有很多事情在变化。

  2. 你的功能做了太多事情,很难说出实际的bug在哪里。至少考虑三个功能:

    • get_sentence_from_user()返回一个字符串。

    • prep_sentence(sentence)摆弄,.个字符,并返回生成的“预备”字符串。

    • 使用字符串的split方法将其拆分为单词列表。 (不需要自己写这个。)

    • merge_words(words) 通过一次附加一个单词来构建新列表,任何'a', 'thing'出现的单词都合并到单个元素'a thing'中。它返回新的,可能更短的列表。

  3. 如评论中所述,如果您确实要修改输入列表,则pop方法会删除最右边的元素。要删除其他元素,必须为其提供该元素的整数索引。 (顺便说一下,如果你担心的话,这很可能比建立一个新的输出列表更慢。)

  4. 当您找到单词'a'时,您会立即开始处理列表中的下一个单词,而不会验证下一个单词。这会引发IndexError ...有时。