封闭局部范围内的变量与全局范围内的变量 - Python
Variable in enclosed local scope vs variable in global scope - Python
大家好,我不明白为什么在调用 find_average()
时,全局范围内的 total = 20
被用于 find_total()
函数,而不是 total = 10
在封闭范围内?
在此先感谢您的任何见解和帮助!
total = 20
def find_total(l):
return total
def find_length(l):
length = len(l)
return length
def find_average(l):
total = 10
return find_total(l) / find_length(l)
average = find_average(example_list)
每个函数都有自己的作用域。它从局部函数、内部作用域开始,然后通过封闭函数向外移动,直到到达全局(模块)作用域。此顺序取决于函数在 中 定义的范围。堆栈(调用序列)不是用于变量查找。
在您的示例中,每个函数只有其内部作用域和外部作用域。对于 find_total
,即 <module>.find_total.<locals>
和 <module>
。因此,每当 find_total
为 运行 时,它将在其本地范围内查找 total
,失败后,将在全局范围内查找。在那里,total == 20
.
find_average
内的范围是 find_average
独有的。全局范围 find_total
或 find_length
都不能访问它。如果你想从 find_average
内部传递一些东西到 find_total
,你应该通过参数来传递。
或者,如果 find_total
可以在 find_average
中定义。这样,find_total
通过搜索序列 <module>.find_average.<locals>.find_total.<locals> -> <module>.find_average.<locals> -> <module>
.
来解析名称
total = 20
def find_length(l):
length = len(l)
return length
def find_average(l):
total = 10
def find_total(l):
return total
return find_total(l) / find_length(l)
average = find_average(example_list)
这将使 find_total
无法从外部访问 find_average
!
大家好,我不明白为什么在调用 find_average()
时,全局范围内的 total = 20
被用于 find_total()
函数,而不是 total = 10
在封闭范围内?
在此先感谢您的任何见解和帮助!
total = 20
def find_total(l):
return total
def find_length(l):
length = len(l)
return length
def find_average(l):
total = 10
return find_total(l) / find_length(l)
average = find_average(example_list)
每个函数都有自己的作用域。它从局部函数、内部作用域开始,然后通过封闭函数向外移动,直到到达全局(模块)作用域。此顺序取决于函数在 中 定义的范围。堆栈(调用序列)不是用于变量查找。
在您的示例中,每个函数只有其内部作用域和外部作用域。对于 find_total
,即 <module>.find_total.<locals>
和 <module>
。因此,每当 find_total
为 运行 时,它将在其本地范围内查找 total
,失败后,将在全局范围内查找。在那里,total == 20
.
find_average
内的范围是 find_average
独有的。全局范围 find_total
或 find_length
都不能访问它。如果你想从 find_average
内部传递一些东西到 find_total
,你应该通过参数来传递。
或者,如果 find_total
可以在 find_average
中定义。这样,find_total
通过搜索序列 <module>.find_average.<locals>.find_total.<locals> -> <module>.find_average.<locals> -> <module>
.
total = 20
def find_length(l):
length = len(l)
return length
def find_average(l):
total = 10
def find_total(l):
return total
return find_total(l) / find_length(l)
average = find_average(example_list)
这将使 find_total
无法从外部访问 find_average
!