全局和局部变量误解

时间:2016-10-03 08:54:16

标签: python global-variables

我对以下代码的输出有疑问:

def f():

     global s
     print(s)
     s = "That's clear."
     print(s)

s = "Python is great!"
f()
print(s)

输出是这样的:

  

Python很棒!

     

很清楚。

     

很清楚。

我的问题是:为什么它是最后一个输出(即第三个输出)也是"那是明确的" 。
为什么第三个输出不是" Python很棒!" 。 我认为代码中的最后一个语句(即print(s))语句在函数f()之外。所以不应该在这里打印查看全局定义的s变量吗?在这种情况下,全局定义的变量s将引用值" Python很棒!",不是吗?对不起,必须有一些我不明白的概念。我是python的新手。有人可以解释这个简单的概念。

2 个答案:

答案 0 :(得分:0)

要查看您的输出,您的代码结构必须是:

def f():
    global s
    print(s) # s outside the function
    s = "That's clear." # new global s created
    print(s) # print the new s

s = "Python is great!" # s before you call the function/get to s = "That's clear."
f() # f gets called and new global s is created
print(s) # you see the new global s created in the function

使 s 全局意味着您在f范围之外看到它,您已经在到达最后一次打印时执行了该功能,所以现在 s 指向That's clear.

如果你想获得你想要的输出,你可以将s传递给函数而不使用global关键字,这样f中创建的 s 只能在范围内访问功能本身。

def f(s):
    print(s)
    s = "That's clear."
    print(s)

s = "Python is great!"
f(s)
print(s)

这应该是一个很好的教训,为什么使用 global 很少是一个好主意。

答案 1 :(得分:-1)

假设您已全局声明变量s = "Python is great!"。 您可能没有正确缩进代码,下面的代码:

def f():
     global s
     print(s)
     s = "That's clear."
     print(s)

     s = "Python is great!"
f()
print(s)

会给你输出

  

Python很棒!

     

很清楚。

     

Python很棒!

您编写的代码应该主要是提供无限递归,并且应该达到最大递归深度。

缩进在python中非常重要,当你缩进函数调用f()和语句print(s)时,python认为这两个语句都是函数f()的一部分。当在第一次函数调用期间到达语句f()时,python将自动再次调用该函数并重复整个过程。实际上,您永远无法达到第三份印刷声明。