Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么可以';Python是否从外部访问子函数?_Python - Fatal编程技术网

为什么可以';Python是否从外部访问子函数?

为什么可以';Python是否从外部访问子函数?,python,Python,为什么上述(如此简单的代码)在Python中不可能实现?是否有一种“pythonic”(易读、不令人惊讶、不黑客)的解决方法,它不会将()转换为类 编辑1:上面向我解释了B是A的局部,因此它只在A被评估时存在。因此,如果我们将其设置为全局(并且确保不将其覆盖),那么为什么这不起作用呢 def A(): def B(): #do something a = A() a.B() 它说它正在返回一个“非类型”对象。因为函数定义只是在本地名称空间中创建一个名称。你所做的与以下

为什么上述(如此简单的代码)在Python中不可能实现?是否有一种“pythonic”(易读、不令人惊讶、不黑客)的解决方法,它不会将()转换为类

编辑1:上面向我解释了B是A的局部,因此它只在A被评估时存在。因此,如果我们将其设置为全局(并且确保不将其覆盖),那么为什么这不起作用呢

def A():
    def B():
        #do something

a = A()
a.B()

它说它正在返回一个“非类型”对象。

因为函数定义只是在本地名称空间中创建一个名称。你所做的与以下没有什么不同:

def A():
    def B():
        #do something
    return A()

a = A()
a.B()
然后询问为什么不能从函数外部访问
a
。绑定在函数中的名称是函数的本地名称

此外,您提出的代码很奇怪。如果执行
a=f()
,则将a设置为函数的返回值。函数不返回任何内容,因此不能希望通过返回值访问任何内容。可以直接返回内部函数:

def f():
    a = 2

这确实是有用的。但是除了修改全局变量(这通常是个坏主意)或返回值之外,没有一种从外部访问函数内部内容的通用方法。函数就是这样工作的:它们接受输入并返回输出;它们不能让外部单词使用它们的内部信息。

要使用所需语法调用B,请使用:

def f():
   def g():
      return "blah"
   return g

>>> func = f()
>>> func()
'blah'

不幸的是,它是无用的,因为要初始化
A.B
必须调用
A()
至少一次:(@prokher调用A甚至创建一个嵌套函数都是必要的。每次调用A时,它都是一个不同的函数。这是拥有嵌套函数的唯一原因。这不是无用的。你必须知道在哪里使用它!谢谢@panda-34。
def A():
    def B():
        print("I'm B")
    A.B = B
    return A

a = A()
a.B()
A.B()