Python 3.x 试图理解python作用域和全局关键字的行为

Python 3.x 试图理解python作用域和全局关键字的行为,python-3.x,scope,Python 3.x,Scope,输出: def func(): def nested(): global x x = 1 x = 3 nested() print("func:", x) x = 2 func() print("main:", x) 我是编程新手。我想知道我错在哪里。由于我是stack exchange新手,请告知我的问题是否存在任何问题或如何改进 我阅读此代码的方式是: x被指定为整数2 调用func()函数 x被指定为整数3 调用n

输出:

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

x = 2    
func()
print("main:", x)
我是编程新手。我想知道我错在哪里。由于我是stack exchange新手,请告知我的问题是否存在任何问题或如何改进

我阅读此代码的方式是:

  • x被指定为整数2
  • 调用func()函数
  • x被指定为整数3
  • 调用nested()函数
  • x是否声明为全局变量#不太清楚其中的含义
  • x被指定为整数1
  • print(“func”:x)#因为x是嵌套()中的全局变量,所以我希望输出为1
  • print(“main”:x)#我相信这是因为x是一个全局变量

  • 我不清楚为什么第一个print命令的输出是3

    这个问题问得很好。原因是
    全局x
    是在嵌套的。不在整个程序中,因此它们是两个不同的变量。

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

    您的步骤应为:

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


    一般提示:每次你认为你需要使用
    global
    时,你几乎肯定不需要。我认为你缺少的是x可以是两个独立的变量,一个局部变量和一个全局变量,尽管名称相同。您可能还想提及
    非本地
    ,因为如果在
    嵌套
    6中使用,可能会产生不同的结果,这可能得益于以下澄清,即在REPL/module/whatnot中,
    x
    全局
    x相同。也许从它们是两个不同的东西(如果名称相同)开始。(将假设的步骤转化为实际发生的事情,就像你一样,我认为这是一个很好的方法,不要吹毛求疵)谢谢!你的回答让我很清楚我错在哪里。实际上,我刚刚下载了一张由某人制作的anki牌,这是我弄不懂的其中一张牌。
    func: 3
    main: 1