我正在尝试使用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
答案 0 :(得分:5)
看看这两行:
vertex = my_queue.pop()
# ...
my_queue = str(test)
因此,在第一次循环之后,my_queue
显然是str
,因为您明确将其转换为一个。
您可以看到String Methods和Common Sequence Operations的列表。请注意,pop
不会出现在任何地方。这是因为pop
只是Mutable Sequence Types的方法,如list
。这正是这个错误告诉你的:
AttributeError: 'str' object has no attribute 'pop'
即使有这样的方法,你还期望它返回什么?字符串的第一个字符?如何使用for n_vertex in vertex['neighbors']
明确期望vertex
是dict
(或其他映射类型),而不是单字符字符串?
我不确定你到底想要做什么,但我怀疑删除str()
电话本身并不足以解决你所有的问题。您将附加到名为test
的列表中,该列表未在函数中的任何位置定义,因此可能是全局变量。然后丢弃my_queue
中的任何内容,而不是将其分配给该全局变量。那可能不是你想要的。我的猜测 - 但这只是一个猜测 - 你想用这个代替最后两行:
my_queue.insert(0, my_data[int_vertex])
答案 1 :(得分:0)
pop方法。 我相信my_queue不是指列表对象,而是指字符串。 通过调试或使用type(),isinstance()内置,您可以了解my_queue所指的数据类型。
答案 2 :(得分:0)
您可以使用ipdb检查列表类型变为字符串的行。 当你到达setrace时,输入例如以下内容来检查类型:
type(my_queue)
答案 3 :(得分:0)
因为pop不是字符串函数,所以必须自己创建函数