试图了解python范围和全局关键字的行为

时间:2017-03-01 07:21:10

标签: python-3.x scope

def func():
    def nested():
        global x
        x = 1
    x = 3
    nested()
    print("func:", x)

x = 2    
func()
print("main:", x)

输出:

func: 3
main: 1

我是编程新手。我想知道我哪里出错了。由于我是堆叠交换的新手,如果我的问题或如何改进它,请告诉我。

我正在阅读此代码的方式是:

  1. x被赋予整数2。
  2. 调用func()函数。
  3. x被赋予整数3。
  4. 调用nested()函数。
  5. x被声明为全局变量?
  6. x被赋予整数1。
  7. print(“func”:x)#因为x在嵌套()中成为一个全局变量我希望输出为1.
  8. print(“main”:x)#I相信这是因为x是一个全局变量?
  9. 我不清楚第一个打印命令中输出为3的原因是什么?

2 个答案:

答案 0 :(得分:4)

简而言之,这里引用了两个不同的标识符x:一个在模型级别,另一个在func本地。

您的步骤应为:

  1. 顶级标识符x(即模块级别)与值2相关联。
  2. 调用func函数。
  3. x本地的完全不同的标识符func与值3相关联。
  4. 调用nested函数。
  5. Python被告知,在nested的此范围内,x指的是顶级(模块级别)x。注意global并不意味着“下一级”,它表示“顶级/全局级别” - 受步骤1影响的同一级别,而不是受步骤3影响的级别。
  6. 全局(顶级)x与值1相关联。
  7. 等。

    一般提示:每当您认为需要使用global时,您几乎肯定不会。

答案 1 :(得分:0)

问的问题非常好。原因是因为global x是在嵌套中声明的。不是整个程序,所以他们有两个不同的变量。