【问题标题】:Python variable inheritance not working (as expected) [duplicate]Python变量继承不起作用(如预期)[重复]
【发布时间】:2021-01-13 01:19:13
【问题描述】:

为什么,在这段代码中,我不能从do_more() 内部访问dbfile

   def do_stuff(queue):
    db = getDbConn()
    while True:
        file = queue.get()  #DirEntry object
        ...
        do_more(otherObject)
        q.task_done()    

我知道我可以将dbfile 作为参数传递给do_more(),但我觉得这些变量应该只在从其他函数调用的函数中可用。它从主要功能到第一级功能都以这种方式工作。我在这里错过了什么?

【问题讨论】:

  • 简短回答:Python 与大多数现代编程语言一样,使用词法(又名静态)范围(外部范围锁定在定义函数的位置),而不是动态范围(外部范围取决于调用站点,每次更改时间)。您的代码工作的唯一方法是使用动态范围,这在 Python 中不是一个东西(不是没有重复中展示的疯狂黑客)。如果您希望do_more 能够访问do_stuff 中的局部变量,则需要在do_stuff 中定义它,以便其词法范围(在本例中为闭包范围)包含do_stuff 的调用的运行时名称。

标签: python python-3.x inheritance


【解决方案1】:

在您提供的代码中,您甚至没有尝试使用来自do_stuff 的变量。

但作为一般规则,您应该能够在子函数中使用父函数中的变量,可以将它们作为变量传递,也可以在初始化子函数时使用它们,如下所示:

def foo():
    foo2 = "foo"
    def bar():
        print(foo2)
    bar()

foo()

如果我没有回答你的问题,请告诉我。

【讨论】:

  • 你在掩盖foo这个名字。
【解决方案2】:

不,您无法访问这些变量,我知道您的想法,这是错误的。 您可以在循环和 if 语句中访问变量,而不是在这里。

假设您有一个在许多不同地方使用的函数,在这种情况下,您可以从该函数访问许多变量,这会使事情变得复杂。

函数应该是独立的对象,它接受一些参数并返回一些东西。所以在函数范围内你只能看到在那里定义的变量和使用括号从父函数传递的参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 2017-04-08
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多