使用python在父函数中调用的子函数中访问父函数的变量

2023-12-12

在 Python 3.4 中,我想调用在父函数外部定义的子函数,该子函数仍然可以访问父函数的作用域(请参见下面的示例)。虽然为了便于查看,我在下面的示例中将函数命名为父函数和子函数,但我正在考虑的函数具有非常独立的任务,因此单独定义它们更有意义。我习惯在 JavaScript 中经常执行以下操作:

def parent():
    test = 0
    child()

def child():
    test += 1
    print(test)

但是,我在执行上述代码时遇到错误。我尝试了使用“nonlocal”关键字的第二种变体,但也失败了:

def parent():
    test = 0
    child()

def child():
    nonlocal test
    test += 1
    print(test)

错误消息是“未找到非本地‘测试’的绑定”。这在 python 中是否可能,就像在许多其他语言中一样,或者是以下唯一选项(不是首选):

def parent():
    test = 0

    def child():
        nonlocal test
        test += 1
        print(test)

    child()

编辑:将父级变量传递给子函数在我的用例中不起作用,因为我需要修改父级变量。

编辑2:父方法和子方法已经是一个类的一部分,该类在逻辑上并不真正具有计数器的属性。计数器是两个函数内部的东西,用于跟踪图中的节点访问(请参见下面的真实示例):

class Graph():
    def depthFirstSearch(self):
        for vertex in self.adjacency_list:
            vertex.status = "not visited"
            vertex.previous = None

        visit_count = 0
        for vertex in self.adjacency_list:
            if vertex.status == "not visited":
                self.depthFirstSearchVisit(vertex)


    def depthFirstSearchVisit(self, vertex):
        nonlocal visit_count
        visit_count += 1

        vertex.distance = visit_count
        vertex.status = "waiting"

        for edge in vertex.edges:
            if edge.status == "not visited":
                edge.previous = vertex
                self.depthFirstSearchVisit(edge)

        vertex.status = "visited"
        visit_count += 1
        vertex.distance_finished = visit_count

在这种情况下,您可能想使用一个类。它们真的很容易让你理解。请注意self传递的变量,看看here快速解释课程范围。

#!/usr/bin/env python3

class Family(object):

    def parent(self):
        self.test = 0
        self.child()

    def child(self):
        self.test += 1
        print(self.test)

if __name__ == "__main__":
    Family().parent()

因此,要翻译为您的代码:

#!/usr/bin/env python3

class Graph(object):
    def depthFirstSearch(self):
        for vertex in self.adjacency_list:
            vertex.status = "not visited"
            vertex.previous = None

        self.visit_count = 0
        for vertex in self.adjacency_list:
            if vertex.status == "not visited":
                self.depthFirstSearchVisit(vertex)

    def depthFirstSearchVisit(self, vertex):
        self.visit_count += 1

        vertex.distance = self.visit_count
        vertex.status = "waiting"

        for edge in vertex.edges:
            if edge.status == "not visited":
                edge.previous = vertex
                self.depthFirstSearchVisit(edge)

        vertex.status = "visited"
        self.visit_count += 1
        vertex.distance_finished = self.visit_count

class Edge(object):
    status = "not vistited"

class Vertex(object):
    def __init__(self):
        self.edges = [Edge(), Edge()]

if __name__ == "__main__":
    graph = Graph()
    graph.adjacency_list = [Vertex(), Vertex()]
    graph.depthFirstSearch()

不需要什么花哨的东西。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用python在父函数中调用的子函数中访问父函数的变量 的相关文章

  • 适用于 Python 3.x 的 Hive 客户端

    是否可以使用 Python 3 x 连接到 hadoop 并运行 hive 查询 我正在使用Python 3 4 1 我发现可以按照这里写的方式完成 https cwiki apache org confluence display Hiv
  • Python CSV Writer 在文件末尾留下一个空行

    以下代码在 txt 文件末尾留下一个空白行 我怎样才能不让 writerows 不终止最后一行 with open fname wb as myFile Start the CSV Writer wr csv writer myFile d
  • 在 Python 中,部分函数应用(柯里化)与显式函数定义

    在 Python 中 以下方式是否被认为是更好的风格 根据更一般的 可能是内部使用的功能显式定义有用的功能 或者 使用偏函数应用来显式描述函数柯里化 我将通过一个人为的例子来解释我的问题 假设编写一个函数 sort by scoring 它
  • 如何使用python登录页面,该页面需要服务器在第一次请求时响应会话ID?

    我正在编写一个脚本来登录某个网页 我使用 request 和 request session 模块来实现此目的 在使用登录参数的第一个请求时 服务器响应一个会话 ID 如何设置该会话 ID 以进一步登录到同一页面 url some url
  • 以 str.format 切片字符串

    我想实现以下目标str format x y 1234 5678 print str x 2 str y 2 我能够做到这一点的唯一方法是 print 0 1 format str x 2 str y 2 现在 这是一个例子 我真正拥有的是
  • 生成 Flask 中使用的签名会话 cookie 值

    我正在用另一个需要将项目注入会话的 Flask 服务器代理 Flask 服务器 两台服务器具有相同的密钥 因此加密签名将相同 当使用 Flask 和会话时 http 响应包含一个 Set Cookie 标头session text 其中 t
  • 使用 glGetFloatv 检索 pyglet 中的模型视图矩阵

    我正在使用 pyglet 在 python 中进行 3D 可视化 并且需要检索模型视图和投影矩阵来进行一些选择 我使用以下方式定义我的窗口 from pyglet gl import from pyglet window import wi
  • 如何在 Python 2.4 CSV 阅读器中禁用引用?

    我正在编写一个 Python 实用程序 需要解析一个我无法控制的大型且定期更新的 CSV 文件 该实用程序必须在仅提供 Python 2 4 的服务器上运行 CSV 文件根本不引用字段值 但Python 2 4版本的csv库 http ww
  • 如何在python 2.7.8中将非英文字母的字典写入文件?

    这是一个简单的例子 test location 北京 country 中国 the values are Chinese 在文件 test log 中 location 北京 country 中国 在python 2 7 8中 当我需要输出
  • TCP打孔问题

    我尝试使用 Python 3 中概述的原则为防火墙编写一个基本的 TCP 打孔器本文 http www bford info pub net p2pnat index html 不过 我无法连接任何东西 这是代码 usr bin pytho
  • 使用 NumPy 的 Mittag-Leffler 函数的不稳定性

    在尝试重现时Wolfram MathWorld 上的情节 http mathworld wolfram com Mittag LefflerFunction html 并试图帮助这个问题 https stackoverflow com qu
  • self.__dict__.update(**kwargs) 的风格是好是坏?

    在 Python 中 假设我有一些类 Circle 它继承自 Shape Shape 需要 x 和 y 坐标 此外 Circle 需要半径 我希望能够通过执行类似的操作来初始化 Circle c Circle x 1 y 5 r 3 Cir
  • Pygooglevoice登录错误

    另一个人问了这个问题 但没有回复 所以我再问一遍 我正在尝试使用 pygooglevoice API 但是当我运行 SMS py 示例脚本时 它给了我一个登录错误 我已经安装了 Enthought python 我想也许我还需要安装其他东西
  • 完全定制的Python帮助用法

    我正在尝试使用 Python 创建完全自定义的 帮助 用法 我计划将其导入到许多我想要具有风格一致性的程序中 但遇到了一些麻烦 我不知道为什么我的描述忽略换行符 尝试过 和 我无法让 出现在 ARGS 行的 换行符之后 显然它们坐在自己的行
  • 如何从 Python 3.5 降级到 3.4

    我想安装 kivy 链接在这里 https kivy org docs installation installation windows html install win dist 用于项目 但是 当尝试使用 pip 安装它所依赖的包时
  • 是否可以在 Jupyter 笔记本中显示控制台?

    我希望能够使用 Jupyter 笔记本中的控制台在环境中进行摆弄 添加额外的单元格意味着我总是必须滚动到最底部或在我想要 类似控制台 文本字段的任何地方创建新单元格 是否可以有一个永久的控制台窗口 例如在窗口底部 Thanks 您可以启动连
  • 模拟类:Mock() 还是 patch()?

    我在用mock http www voidspace org uk python mock index html使用Python 想知道这两种方法中哪一种更好 阅读 更Pythonic 方法一 只需创建一个模拟对象并使用它 代码如下 def
  • Tkinter 如何根据此组合框自动更新第二个组合框

    我在 Tkinter Python 中遇到了组合框更新的问题 我有两个组合框 组合框A with values A B C and 组合框B 我想要的是 当值A在组合框中选择A然后在组合框中B显示值 1 2 3 当值B在组合框中选择A然后在
  • Pandas:按日历周分组,然后绘制真实日期时间的分组条形图

    EDIT 我找到了一个非常好的解决方案并将其发布在下面作为答案 结果将如下所示 您可以为此问题生成一些示例数据 codes list ABCDEFGH dates pd Series pd date range 2013 11 01 201
  • python 相当于 sed

    有没有一种方法 无需双循环即可完成以下 sed 命令的操作 Input Time Banana spinach turkey sed i Banana s Toothpaste file Output Time BananaToothpas

随机推荐

  • 如何从流中准确读取一个字符?

    我有一个带有一些文本数据的流 可以是 ASCII UTF 8 Unicode 编码是已知的 我需要从流中准确读取一个字符 而不再前进流位置 StreamReader 是不合适的 因为它会积极地从流中预取数据 Ideas 如果您想一次一个字节
  • 正则表达式匹配确切的数字,如果它存在于字符串中则不匹配

    我的正则表达式 3 b Matches 103 134 256 3 我希望它只匹配唯一的 3 数字 3 将是一个动态数字 正则表达式必须匹配该确切数字 而不是其他数字 如果该数字存在于另一个数字 如 103 中 则它不能匹配 那么它不应该匹
  • 对 NHibernate 缓存搜索的影响,其结果包括映射为公式的计算值(例如排名)

    当在 NHibernate 中使用公式定义计算属性时 当公式根据查询限制 尤其是查询缓存 改变其结果时 会产生什么影响 更具体地说 请考虑以下简单的 C 类 public class Entity public Entity public
  • 使用 Linux binutils 设置 ELF 映像基地址的优雅方法?

    对于个人项目 我需要编写一个在非默认内存地址加载的可执行文件 从这个问题 我知道我可以设置 ELF 的入口地址并手动修改节地址 以便可执行文件有效地基于我选择的某个地址 然而 答案表明 只有当我不进行 glibc 初始化 这个项目需要它 时
  • 无序线程问题

    我问过关于锁定的问题here人们回答说我的锁实现没有问题 但我发现了问题 这是相同的锁实现 我得到了奇怪的结果 我希望看到数字从 1 开始 但它是从 5 开始 示例如下 class Program static object locker
  • asp.net mvc 不断用 .wml 覆盖 text/html 内容类型

    我正在开发一个可以在移动 手机 设备上查看的网站 我只是使用纯 HTML 4 01 没有什么特别的 除了诺基亚 Series 40 第 1 5 版之外 这些页面在我们测试过的所有移动浏览器上都呈现良好 仔细观察 IIS 似乎会自动渲染内容类
  • BitBucket - 直接添加到开发分支而不是主分支

    我们正在将 SCM 更改为 BitBucket 目前我们使用 Clearcase SCM 我们在不同阶段 流中拥有代码 开发 UAT 和生产 其中开发具有开发人员当前正在处理的代码 UAT 已完成由 BP 测试的更改 而生产具有部署到生产的
  • 为文本区域内的线条着色

    有没有办法让textarea显示颜色的线条 我想要实现的是每隔一行都着色 即白色 灰色 白色 灰色 白色 灰色 以获得更好的可读性 用户应该写很多东西 比如 输入名称 每一个都从新行开始 无论如何 我确实使用 jQuery 所以如果他们为此
  • 带返回值的跨域弹窗

    这是设置 我在两个不同的域上有两个网站 www website1 com www someotherwebsite com 这就是我想做的 当用户开机时www website1 com然后单击一个链接 我想要一个弹出窗口显示www some
  • 使用 gdb 在多屏幕窗口中调试 MPI

    如果我有一个 MPI 程序 想要使用 gdb 进行调试 同时能够查看所有单独进程的输出 我可以使用 mpirun n
  • DbContext.OnConfiguring 没有被调用并且在 ASP.NET Core 中表现得很奇怪

    在我的 asp net core 项目中我有一个ReadingContext类派生自DbContext 根据文件OnConfiguring应该为每个实例调用DbContext即被创建 但就我而言 仅当我在调试时检查实例时才会调用它 我里面有
  • 如何在使用 AMD 时在 Backbone.js 中加载引导模型 (require.js)

    Backbone js 文档建议以这种方式加载引导模型 但这是一个不能使用的模式AMD 方法 使用 require js 唯一可能的解决方案是声明存储 JSON 数据的全局变量并稍后在相关初始化方法中使用该变量 有没有更好的方法这样做 没有
  • 为什么有些 Gulp 流默认“流动”,而另一些则不流动?

    考虑这两个 gulp 任务 gulp task src function done gulp src docs on end function console log ending done gulp task dest function
  • Firebase Cloud Functions 未记录,似乎未部署

    Firebase Cloud Functions 自大约 10 年后就没有记录过 今天下午4点 它们似乎也没有正确部署 但在没有日志的情况下很难判断 网站上以及使用 firebase 函数 日志 运行 cli 时缺少日志 有人知道出了什么问
  • 最小年龄验证 laravel

    我想验证用户信息 例如出生日期 因为我在验证中使用了以下语句行 但是如何使其动态 以便用户的最低年龄可以为 13 岁 低于该年龄的用户无法注册 return Validator make data first name gt require
  • 如何将按钮的DataContext更改为父级DataContext?

    我在 WPF 中有 2 个课程 Meeting People 在会议中我有 2ObservableCollections AttendingMeeting and NotAttendingMeeting包含People objects 在
  • 将数组类型导入hana?

    我正在使用 CSV 文件将数据导入 SAP HANA 当我尝试导入具有数组类型的列时 会导致以下错误 ARRAY 类型与 PARAMETER TYPE 不兼容 例如 CREATE COLUMN TABLE SCHEMA TABLE ID I
  • 尝试使用图形 API 从 Azure Active Directory 获取组时 Authorization_RequestDenied

    我尝试使用 Graph API 获取有关 Azure Active Directory 组的信息 但不断收到 Authorization RequestDenied 响应 这个问题类似于尝试使用 Azure AD Graph API 获取登
  • 将方法作为参数传递[重复]

    这个问题在这里已经有答案了 我正在使用 C 中的一个库 其中的方法要求我将目标方法的字符串名称作为参数传递 出于显而易见的原因 我想避免使用硬编码字符串 因此我将编写一个中间 util 方法 该方法采用一个方法 获取名称 大概通过反射 并将
  • 使用python在父函数中调用的子函数中访问父函数的变量

    在 Python 3 4 中 我想调用在父函数外部定义的子函数 该子函数仍然可以访问父函数的作用域 请参见下面的示例 虽然为了便于查看 我在下面的示例中将函数命名为父函数和子函数 但我正在考虑的函数具有非常独立的任务 因此单独定义它们更有意