【问题标题】:Can a Python nested function variable be used in other nested functions?Python 嵌套函数变量可以在其他嵌套函数中使用吗?
【发布时间】:2021-02-21 13:06:44
【问题描述】:

我目前正在开发一个简单的计算器程序,但在从嵌套函数中获取数据并将其用于另一个嵌套函数时遇到了问题。

这是我的代码中与此问题相关的部分:

def func():
  
  def func1():
    a = float(input("Enter first number: "))
    b = float(input("Enter second number: "))
  
  def func2():
    print(f"{a}, {b}")

  func1()
  func2()

func()

如您所见,func() 被调用,它调用 func1()func2()。但是,运行此程序会导致 NameError: name 'a' is not defined 带有指向 func2() 主体的错误参考线。

我知道在func2() 内无法访问a, b,因为它们仅在func1() 内定义,但我不能根据documentation 使用nonlocal 语句:

'在非本地语句中列出的名称......必须引用封闭范围内预先存在的绑定。'

并且func1() 不包含func2()

更重要的是,我试图避免使用global 语句或在func() 中定义ab,因为在任何编程语言(reference) 中这似乎都是不好的做法,并且可能导致后来在我的程序开发中出现了意想不到的副作用。

有没有办法在func() 中的任何地方声明ab 可用和可修改,同时仍在func1 中定义它?

【问题讨论】:

  • 您可以从 func1 返回 a 和 b 值并将它们作为参数传递给 func2

标签: python function scope encapsulation local-variables


【解决方案1】:

您只需在 func1 中返回它们并将结果传递给 func2

def func1():
    a = float(input("Enter first number: "))
    b = float(input("Enter second number: "))
    return a, b

那么,

def func2(a, b):
    print(f"{a}, {b}")

然后当您调用函数时,您将变量 a 和 b 分配给 func1 的结果并将它们作为参数传递给 func2,

a,b = func1()
func2(a, b)

您可以在 func 范围内初始化变量,但最好将它们作为函数的返回来处理,这样更容易跟踪算法。

【讨论】:

    【解决方案2】:

    这是范围的问题。

    你有 2 种可能性让它发挥作用:

    1.在func1 中返回ab,并在func2 中调用func1

    def func():
      
        def func1():
          a = float(input("Enter first number: "))
          b = float(input("Enter second number: "))
    
          return (a,b)
      
        def func2():
          a,b = func1()
          print(f"{a}, {b}")
    
      
        func2()
    
    func()
    

    2。在func1中定义func2,声明后在func1中调用func2,在声明后在func中调用func1

    def func():
      
        def func1():
          a = float(input("Enter first number: "))
          b = float(input("Enter second number: "))
    
    
      
          def func2():
            print(f"{a}, {b}")
    
      
          func2()
        func1()
    
    func()
    

    【讨论】:

      猜你喜欢
      • 2014-06-30
      • 2011-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-17
      • 2018-07-16
      • 2018-05-10
      相关资源
      最近更新 更多