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()
的内容很有用,它们是内置函数,返回范围内所有内容的字典,因此您可以查看它是如何根据赋值和函数定义进行更改的。