AttributeError:'str'对象没有属性'pop'

时间:2014-01-22 08:11:29

标签: python

我正在尝试使用pop with list但是它给了我以下错误

AttributeError: 'str' object has no attribute 'pop'

我使用pop的方式是:

vertex = my_queue.pop()

令人困惑的是,当我使用print(顶点)时,它打印出数据,这意味着它工作正常,但同时显示错误令人困惑。

我的代码:

 def bfs(my_data):
      my_queue = [] #array to store vertices
      #print(my_data[0])
      my_queue.insert(0, my_data[0]); 
      my_data[0]['visited'] = '1';
      int_vertex = []

      while my_queue:
                vertex = my_queue.pop()
                for n_vertex in vertex['neighbors']:
                          #print(type(n_vertex))
                          int_vertex = int(n_vertex)
                          if my_data[int_vertex]['visited'] == '0':
                                    my_data[int_vertex]['visited'] = '1'
                                    test.insert(0, my_data[int_vertex])
                                    my_queue = str(test)

my_queue& my_data是列表,顶点是dict

4 个答案:

答案 0 :(得分:5)

看看这两行:

vertex = my_queue.pop()
# ...
my_queue = str(test)

因此,在第一次循环之后,my_queue显然是str,因为您明确将其转换为一个。

您可以看到String MethodsCommon Sequence Operations的列表。请注意,pop不会出现在任何地方。这是因为pop只是Mutable Sequence Types的方法,如list。这正是这个错误告诉你的:

AttributeError: 'str' object has no attribute 'pop'

即使有这样的方法,你还期望它返回什么?字符串的第一个字符?如何使用for n_vertex in vertex['neighbors']明确期望vertexdict(或其他映射类型),而不是单字符字符串?


我不确定你到底想要做什么,但我怀疑删除str()电话本身并不足以解决你所有的问题。您将附加到名为test的列表中,该列表未在函数中的任何位置定义,因此可能是全局变量。然后丢弃my_queue中的任何内容,而不是将其分配给该全局变量。那可能不是你想要的。我的猜测 - 但这只是一个猜测 - 你想用这个代替最后两行:

my_queue.insert(0, my_data[int_vertex])

答案 1 :(得分:0)

python中的字符串对象不支持

pop方法。 我相信my_queue不是指列表对象,而是指字符串。 通过调试或使用type(),isinstance()内置,您可以了解my_queue所指的数据类型。

答案 2 :(得分:0)

您可以使用ipdb检查列表类型变为字符串的行。 当你到达setrace时,输入例如以下内容来检查类型:

type(my_queue)

答案 3 :(得分:0)

因为pop不是字符串函数,所以必须自己创建函数