与命名空间和范围主题相关的Python程序中的混淆

时间:2017-03-30 03:26:37

标签: python

我刚刚介入python,现在我开始讨论Namespace和Scope的主题。为了进一步理解这个主题,I found this包含一个导致我混乱的程序。

而且,这是程序:

1  def outer_function():
2      a = 20
3      def inner_function():
4          a = 30
5          print('a =',a)
6
7      inner_function()
8      print('a =',a)
10     
11 a = 10
12 outer_function()
13 print('a =',a)

这里的结果你必须非常确定,但我不是

a = 30
a = 20
a = 10

但我脑海中的输出应该是

a = 30
a = 30
a = 20
a = 10

即使我将原始代码修改为这样,以便更清楚:

def outer_function():
    a = 20
    def inner_function():
        a = 30
        print('a1 =',a)

    inner_function()
    print('a2 =',a)

a = 10
outer_function()
print('a3 =',a)

但它仍然是这样的:

a1 = 30
a2 = 20
a3 = 10

所以,我之所以认为那应该是双a1 = 30是因为我认为代码中的line5被执行了两次,

首先,它会在outer_function()调用line12时运行,line1line8调到line5a1 = 30调用line7输出

其次,调用line5,使用与上面相同的输出再次触发outer_function()

最后,line8函数会在a2 = 20完成时结束,line13出现时就会结束。

然后回到"主线程" (我只是称它为实际上并不意味着它,或者是它?)a3 = 10并打印line5

所以,我得到的并不是我想的,我对这个程序的理解有什么不对?

感谢您花时间阅读我的问题,如果您可以帮我一点,这将对我有很大的帮助:)提前致谢

编辑:

我刚刚发现了我的困惑!非常感谢那些帮助我的人。 原来我混淆的主要问题是我对编程知识的不稳定基础。所以,我错误地认为inner_function()将在声明a = 30时运行。哈哈哈,怎么会这样呢?这个基本的错误刚刚发生 - 函数的声明永远不会运行,直到在程序中调用它!这就是为什么只有一个$issue[] = "$row->issue, $row->category";

无论如何,我会记住,不要再犯同样的错误。我非常感谢那些帮助解决这个小小的基本句法错误的人!

干杯!

1 个答案:

答案 0 :(得分:2)

第{3}行宣布了inner_function,但只有一次,而第7行就是

如果您取出第7行,a1将永远无法打印。