在python的Visual Studio调试器中,递归堆栈框架具有相同的值

gcr

我试图在python创建的图类上进行深度优先的递归搜索。由于某种未知的原因AssertionError: None not found in [[1, 2, 4, 6], [1, 2, 4, 7, 6]],我在声明级别的测试失败了:,我了解该错误的含义,并且我不会直接询问该算法,而是询问其他问题。

我决定使用VS Code python调试器检查运行中的代码,并注意到随着每个新调用将新的堆栈帧推入堆栈(参见图片),它们为“已访问”(设置)和“路径”共享相同的值'(列出)实例(完全意外和令人困惑)。我添加了一个callnumber虚拟变量作为健全性检查,以确保我正确地使用了调试器。

我不知道为什么我没有早点了解它,特别是因为我已经在C和内存管理方面做了很多工作。这些对象显然是放在堆上并通过引用传递的,因此不是真正的独立实例,对吗?

有什么方法可以使这些基于堆栈的变量?我知道不建议这样做,因为这可能会导致堆栈溢出(没有双关语),也不会充分利用空间。

现在我了解了所发生的事情,我想知道您是否有一些关于如何使该算法运行的指针(这次是双关语),因为这种方法由于基于堆而无法工作?我不需要解决它,只需一些提示或线索,就可以产生更深刻的想法。

顺便说一句,我一直在努力提高阅读和理解文档的能力。我喜欢将文档作为我的第一篇文章,但是当我用python搜索某些东西时,与其他语言不同,它们总是接近过去的随机教程。刚刚进入了内置类型的官方页面,并搜索了堆或内存之类的单词以获取列表和字典,但没有找到任何解释这些对象的位置,它们如何增长或调整大小的信息,尽管它可能如此明显对经验丰富的程序员而言是隐式的,但是无论如何,这是我的代码

class Graph:
    def __init__(self):
        self.vertices = {}
    def add_vertex(self, vertex_id):
        self.vertices[vertex_id] = set()
    def add_edge(self, v1, v2):
        self.vertices[v1].add(v2)
    # more functions

    def dfs_recursive(self, starting_vertex, destination_vertex, visited = set(), path=[]):
        """
        Return a list containing a path from
        starting_vertex to destination_vertex in
        depth-first order.

        This should be done using recursion.
        """
        result = None
        path.append(starting_vertex)
        visited.add(starting_vertex)
        if starting_vertex == destination_vertex:
            return path
        for neighbor in self.vertices[starting_vertex]:
            if neighbor not in visited:
                visited.add(neighbor)
                result = self.dfs_recursive(neighbor, destination_vertex, visited, path, callnumber+1)
        return result

在此处输入图片说明

编辑:由于rioV8的输入,解决了算法。这是我的代码

    def dfs_recursive(self, starting_vertex, destination_vertex, visited = None, path=None, callnumber=1):

        path = path or []
        visited = visited or set()
        path.append(starting_vertex)
        visited.add(starting_vertex)
        if starting_vertex == destination_vertex:
            return path
        for neighbor in self.vertices[starting_vertex]:
            if neighbor not in visited:
                result = self.dfs_recursive(neighbor, destination_vertex, visited.copy(), path[:], callnumber+1)
                if result is not None and result[-1] == destination_vertex:
                    return result
        return None

rioV8

不要将可修改对象用作函数默认参数。

它们是在函数编译时创建的,而不是在函数调用时创建的。并被重用于每个呼叫。

None在函数内部使用并创建可修改的。

并在递归调用中制作可修改的副本。

def dfs_recursive(self, starting_vertex, destination_vertex, visited=None, path=None):
    visited = visited or set()
    path = path or []
    # rest of function
    result = self.dfs_recursive(neighbor, destination_vertex, visited.copy(), path[:], callnumber+1)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

bash 脚本中 Python 命令的 Visual Studio 调试器

来自分类Dev

在Visual Studio 2015调试器中确定每帧的堆栈大小

来自分类Dev

如何使用带有Enthought Canopy Distribution的Python Tools for Visual Studio混合模式调试器?

来自分类Dev

为什么Visual Studio 2015中没有本地Windows调试器?

来自分类Dev

转到pdb中的顶部框架(python调试器)

来自分类Dev

强制C ++程序在Visual Studio调试器中暂停

来自分类Dev

程序在Visual Studio调试器中挂起

来自分类Dev

在Visual Studio调试器中更改显示变量的顺序

来自分类Dev

调试器在Visual Studio中不起作用

来自分类Dev

在Visual Studio调试器中如何访问IloIntArray元素?

来自分类Dev

Visual Studio 2015调试器崩溃

来自分类Dev

在Visual Studio 2019 / C#中暂停调试器之前,有没有办法运行代码?

来自分类Dev

通过值传递的参数在Visual Studio 2015 x64调试器中显示不正确?

来自分类Dev

Visual Studio Code不会使用池映射将调试器附加到python中的多个进程

来自分类Dev

无法在Visual Studio 2013调试器中调试CRT源文件

来自分类Dev

如何为Python(调试器)设置Visual Studio Code stdin / stdout重定向?

来自分类Dev

Visual Studio Code - Python - 列表索引限制最大 300 - 调试器

来自分类Dev

Visual Studio调试器无法运行现有节点项目

来自分类Dev

如何在visual studio中调试python

来自分类Dev

使用Visual Studio调试器查看/诊断内存转储中的逻辑.NET线程

来自分类Dev

可以杀死/终止Visual Studio调试器中的某个线程吗?

来自分类Dev

字符串在Visual Studio调试器中包含引号,但string.contains返回false

来自分类Dev

运行XSLT调试器时,包含链接的XML在Visual Studio中引发错误

来自分类Dev

在Visual Studio调试器中以自定义顺序显示属性

来自分类Dev

Visual Studio 2013 C ++:STL容器的元素显示在调试器中

来自分类Dev

在Visual Studio扩展中,如何检测调试器何时继续

来自分类Dev

在Visual Studio扩展中,获取停止调试器的函数的行范围

来自分类Dev

不要在Visual Studio 2012中使用“调试器”签入

来自分类Dev

在Visual Studio Code C ++调试器中设置断点时出错

Related 相关文章

  1. 1

    bash 脚本中 Python 命令的 Visual Studio 调试器

  2. 2

    在Visual Studio 2015调试器中确定每帧的堆栈大小

  3. 3

    如何使用带有Enthought Canopy Distribution的Python Tools for Visual Studio混合模式调试器?

  4. 4

    为什么Visual Studio 2015中没有本地Windows调试器?

  5. 5

    转到pdb中的顶部框架(python调试器)

  6. 6

    强制C ++程序在Visual Studio调试器中暂停

  7. 7

    程序在Visual Studio调试器中挂起

  8. 8

    在Visual Studio调试器中更改显示变量的顺序

  9. 9

    调试器在Visual Studio中不起作用

  10. 10

    在Visual Studio调试器中如何访问IloIntArray元素?

  11. 11

    Visual Studio 2015调试器崩溃

  12. 12

    在Visual Studio 2019 / C#中暂停调试器之前,有没有办法运行代码?

  13. 13

    通过值传递的参数在Visual Studio 2015 x64调试器中显示不正确?

  14. 14

    Visual Studio Code不会使用池映射将调试器附加到python中的多个进程

  15. 15

    无法在Visual Studio 2013调试器中调试CRT源文件

  16. 16

    如何为Python(调试器)设置Visual Studio Code stdin / stdout重定向?

  17. 17

    Visual Studio Code - Python - 列表索引限制最大 300 - 调试器

  18. 18

    Visual Studio调试器无法运行现有节点项目

  19. 19

    如何在visual studio中调试python

  20. 20

    使用Visual Studio调试器查看/诊断内存转储中的逻辑.NET线程

  21. 21

    可以杀死/终止Visual Studio调试器中的某个线程吗?

  22. 22

    字符串在Visual Studio调试器中包含引号,但string.contains返回false

  23. 23

    运行XSLT调试器时,包含链接的XML在Visual Studio中引发错误

  24. 24

    在Visual Studio调试器中以自定义顺序显示属性

  25. 25

    Visual Studio 2013 C ++:STL容器的元素显示在调试器中

  26. 26

    在Visual Studio扩展中,如何检测调试器何时继续

  27. 27

    在Visual Studio扩展中,获取停止调试器的函数的行范围

  28. 28

    不要在Visual Studio 2012中使用“调试器”签入

  29. 29

    在Visual Studio Code C ++调试器中设置断点时出错

热门标签

归档