寻求对Python 3中函数内部的全局关键字有更深入的理解



Overstack上的第一篇文章。

我对Python和一般编码都是新手。我现在正在学习函数,目前正在看一些描述Python-Course.eu上全局变量的例子:

def f():
global s
print(s)
s = "Only in spring, but London is great as well!"
print(s)
s = "I am looking for a course in Paris!" 
f()
print(s)

产生输出:

I am looking for a course in Paris!
Only in spring, but London is great as well!
Only in spring, but London is great as well!

因此,我的理解是global关键字将globals变量的值更改为";只在春天,但伦敦也很棒"?这准确吗?

如果是这种情况,如果我将global分配给函数内部的变量,而不将值分配给函数外部的s,我会得到错误吗?这是否意味着global关键字只能修改已分配的全局变量?

例如,为什么我不能这样做:

def f():
global s
s = "Only in spring, but London is great as well!"
print(s)
print(s)
f()

我注意到,如果我先运行这个函数,它就会工作。这是否意味着我必须运行函数才能分配全局变量?

这个问题与其说是试图让一段代码发挥作用,不如说是试图理解Python是如何工作的以及为什么工作的。谢谢,如果这个问题已经得到回答,我很抱歉。我只是一直找不到答案。事先非常感谢。

根据Python常见问题解答(我强调(,它相当简单:

在Python中,函数内仅引用的变量是隐式全局变量。如果变量被赋予函数体中任何位置的值,则除非明确声明为全局,否则它将被假定为局部变量。

因此,如果您在函数中的任何位置为变量赋值,则该变量在函数中任何位置都被视为局部,从而导致以下问题:

def fn():
print(s)    # Use before assignment, despite one s being
global s    #   set before calling.
s = 42
s = 7
fn()

这意味着,如果您想更改全局,则需要在函数中将其标记为全局。

如果你正在做的唯一一件事是使用全局变量,这是不需要的,但我倾向于无论如何都标记它,以防我以后想更改它,并为了清晰起见(我很少使用全局变量,几乎永远不会出现这种情况(。

您的代码示例不起作用的原因:

def f():
global s
s = "Only in spring, but London is great as well!"
print(s)
print(s)
f()

是因为s在第一次打印时(在函数调用之前(不存在。即使global确实创建了变量,在第一个print之后调用函数之前也不会发生这种情况。

在任何情况下,global都不会创建变量,它只是指示函数在赋值时使用全局。从以下代码中可以明显看出:

def f():
global s
print(s)
f()

它还抱怨CCD_ 5的不存在。


创建全局而言,当您分配给它们时,它们就会存在。您可以在外部为其分配功能:

def fn():
print(s) # global because function doesn't assign to it.
# Unassigned here
s = 42
# Assigned here
fn()

或者,如果标记为全局,则可以在内部为它们分配函数

def fn():
global s
# Unassigned here
s = 42
# Assigned here
print(s) # global because you said so.
# Unassigned here
fn()
# Assigned here

在没有这些情况下,只有一个本地:

def fn():
# Global unassigned here ...
s = 42
# ... and here
print(s) # local.
# Global unassigned here
fn()
# ... and here.

您需要查看代码序列的第一个示例。从本质上讲,代码将按照您的顺序排列。

s = "I am looking for a course in Paris!" 
print(s)
s = "Only in spring, but London is great as well!"
print(s)
print(s)

第二个例子是它失败的原因,因为您还没有声明变量s。global只是声明变量s的范围,但您必须定义它。

问候Paul

这里缺少的是语句执行的顺序。正如您所指出的,如果您首先运行该函数,它就会工作:

# 1 definition of function f - don't parse or run the code inside here, just know it exists.
def f():
# 4 ... global statement
global s
# 5 assign a value to `s` (the global)
s = "Only in spring, but London is great as well!"
# 6 run print function with parameter `s`
print(s)
# 2 run print function with variable `s` as input. `s` doesn't exist. error.
print(s)
# if we pretend we skip the print
# 3 run the function `f`
f()
# After running `f()` `s` is now defined in the global scope

您可能会发现检查locals()globals()的内容很有用,它们是内置函数,返回范围内所有内容的字典,因此您可以查看它是如何根据赋值和函数定义进行更改的。

相关内容

最新更新