【问题标题】:global and local variables misconception全局变量和局部变量的误解
【发布时间】:2016-10-03 08:54:15
【问题描述】:

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

def f():

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

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

输出是这样的:

Python 很棒!

这很清楚。

这很清楚。

我的问题是:为什么最后一个输出(即第三个输出)也是“很清楚”。
为什么第三个输出不是“Python 很棒!” . 我认为代码中的最后一条语句(即 print(s))语句在函数 f() 之外。那么这里的 print(s) 不应该查看全局定义的 s 变量吗?在这种情况下,全局定义的变量 s 将引用值“Python 很棒!”,不是吗?抱歉,我一定有一些概念误解了。我是python的新手。谁能解释一下这个简单的概念。

【问题讨论】:

  • 很明显你的缩进是错误的,所以如果不知道什么是正确的,就很难回答预期的行为。
  • 让我们大胆猜测一下,并建议当您声明 s 为全局时,函数 fs 的重新定义将全局 s 更改为“很清楚”跨度>
  • @John_w,我修正了你的缩进,在这种情况下很明显,但通常尝试以与本地完全相同的格式发布代码。

标签: python global-variables


【解决方案1】:

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

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 很少是一个好主意。

【讨论】:

  • 谢谢。这里函数 f 内的语句“global s”是否意味着函数 f 内的第二行(即 print(s))上的 s 是指函数外的变量 s 即 s = "Python is great!"或者“global s”是说函数中的第三行(即s =“That's clear”)应该作为全局变量?
  • 如果你删除了全局,你会得到一个 UnboundLocalError: local variable 's' referenced before assignment 错误,因为你在函数中重新分配了 s,如果你在函数中只有 print(s),你会看到 Python is great! 因为 s 在全局命名空间,通过使用 global,您仍然可以访问在函数外部分配的 s 而不会出现任何错误,但是您在函数内部重新分配 s,因此因为您使用了 global,所以当您打印 s 时,您会在 f 之外看到 s 的新值
【解决方案2】:

假设您已全局声明变量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会自动再次调用该函数,并重复整个过程。实际上,您永远无法到达第三个打印语句。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2019-04-04
    • 2013-10-06
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多