gpt4 book ai didi

python : Why is it said that variables that are only referenced are implicitly global?

转载 作者:太空狗 更新时间:2023-10-29 22:15:59 25 4
gpt4 key购买 nike

来自Python FAQ ,我们可以读到:

In Python, variables that are only referenced inside a function are implicitly global

并且来自 Python Tutorial on defining functions ,我们可以读到:

The execution of a function introduces a new symbol table used for the local variables of the function. More precisely, all variable assignments in a function store the value in the local symbol table; whereas variable references first look in the local symbol table, then in the local symbol tables of enclosing functions, then in the global symbol table, and finally in the table of built-in names

现在我完全理解了教程中的陈述,但是说仅在函数内部引用的变量是隐式全局变量对我来说似乎很模糊。

如果我们实际上开始查看局部符号表,然后再查看更“通用”的符号表,为什么说它们是隐式全局的呢?这是否只是一种说法,如果您只打算在函数中引用一个变量,则无需担心它是本地变量还是 global

最佳答案

例子

(进一步查看摘要)

这意味着如果一个变量在函数体中从未分配给,那么它将被视为全局变量。

这解释了为什么以下工作(a 被视为全局):

a = 1

def fn():
print a # This is "referencing a variable" == "reading its value"

# Prints: 1

但是,如果变量被分配给函数体中的某处,那么它将被视为局部对于整个函数体

这包括分配给它之前找到的语句(参见下面的示例)。

这解释了为什么以下内容有效。此处,a 被视为本地,

a = 1

def fn():
print a
a = 2 # <<< We're adding this

fn()

# Throws: UnboundLocalError: local variable 'a' referenced before assignment

您可以让 Python 使用语句 global a 将变量视为全局变量。如果您这样做,那么该变量将被视为全局变量,对于整个函数体也是如此

a = 1

def fn():
global a # <<< We're adding this
print a
a = 2

fn()
print a

# Prints: 1
# Then, prints: 2 (a changed in the global scope too)

总结

与您可能期望的不同,如果在本地范围内找不到 a,Python 将不会回退到全局范围。

这意味着一个变量对于整个函数体来说要么是局部的要么是全局的:它不能是全局的然后变成局部的。

现在,关于一个变量是被视为局部变量还是全局变量,Python 遵循以下规则。变量是:

  • 如果仅被引用且从未分配给则为全局
  • 如果使用global 语句则为全局
  • 如果变量至少被分配一次(并且未使用global),则为局部

补充说明

事实上,“隐式全局”并不真正意味着全局。这是一种更好的思考方式:

  • “本地”的意思是“函数内部的某处”
  • “全局”的真正意思是“函数之外的某处”

因此,如果一个变量是“隐式全局”(==“函数外部”),那么它的“封闭范围”将首先被查找:

a = 25

def enclosing():
a = 2
def enclosed():
print a
enclosed()

enclosing()

# Prints 2, as supplied in the enclosing scope, instead of 25 (found in the global scope)

现在,像往常一样,global 允许您引用全局范围。

a = 25

def enclosing():
a = 2
def enclosed():
global a # <<< We're adding this
print a
enclosed()

enclosing()

# Prints 25, as supplied in the global scope

现在,如果您需要在 enclosed 中分配给 a,并且希望在 enclosed 中更改 a 的值 的范围,但不在全局范围内,那么您将需要 nonlocal,这是 Python 3 中的新功能。在 Python 2 中,您不能。

关于 python : Why is it said that variables that are only referenced are implicitly global?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23458854/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com