我是Python的初学者,并且已经处理了全局变量的概念。当我以为我理解了这个概念时,我看到了一个简短的代码,证明我错了:
message="global"
def enclosure():
message="enclosure"
def local():
global message
message="local"
local()
print(message)
print(message)
enclosure()
print(message)
输出是:
global
enclosure
local
我不明白,为什么第二个输出是机箱,因为当你调用机箱功能时,在这个函数中调用funciton local,其中全局变量消息被设置为“local”,然后根据我的理解在调用机箱功能时应该在最后打印出来(所以我希望全局,本地,本地..)。
那我的思维错误在哪里?
答案 0 :(得分:1)
当您在message="enclosure"
中分配enclosure
时,您为message
提供了该范围的本地变量。嵌套函数改变了全局message
并不重要; enclosure
未声明message
全局,因此它维护自己的本地范围变量,而不依赖于全局变量(local
份)。
答案 1 :(得分:0)
通常,如果可能,您应该尽量避免使用全局变量。通常有一种更清洁的方式来达到你想要的目的。
在您的示例中,您有两个字符串变量,都称为message
。一个具有整个模块的范围,它最初受限于" global"然后在local
方法内部,它会反弹到值#34;本地"。
第二个变量也称为message
,具有enclosure
方法的范围。它最初设置为" enclosure"并且没有修改。
您的第一个print
调用是在模块范围内,因此打印模块范围message
的值,即" global"。您的第二个电话在enclosure
内,因此打印另一个变量的值,即" enclosure"。最后,您打印模块范围message
的值,该值现在已更改为值" local"。
答案 2 :(得分:0)
实际上,您有两个变量,为清楚起见,我添加了后缀1
和2
:
message1="global"
def enclosure():
message2="enclosure" # this is a new declaration, it is a new message.
def local():
global message1
message1="local"
local()
print(message2) # in this scope, only message2 is visible
print(message1)
enclosure()
print(message1)
所以你看,你创建了两个message
,并在第二个print
使用名为message
的第二个变量
答案 3 :(得分:0)
我希望这会对你有所帮助:
def generate_closure(income_tax_rate = 0.33):
def this_is_closure_which_will_give_final_money(raw_income):
final_money = raw_income - (raw_income * income_tax_rate)
return final_money
return this_is_closure_which_will_give_final_money
standard_tax_calculator = generate_closure()
classic_salary = standard_tax_calculator(2000)
final_classic_money = print(classic_salary)
classic_salary_2 = standard_tax_calculator(2499)
final_classic_money_2 = print(classic_salary_2)
rich_people_tax_calculator = generate_closure(income_tax_rate = 0.50)
rich_salary = rich_people_tax_calculator(15000)
final_rich_money = print(rich_salary)
rich_salary_2 = rich_people_tax_calculator(19499)
final_rich_money_2 = print(rich_salary_2)
print("\n------------------------------")
def generate_closure(trapped):
def closure(x):
return trapped ** x
return closure
f = generate_closure(10)
print(f)
f(3)
print(f(3)) # f remember the value 10
del generate_closure
print(f(2)) # it still does work !
print(f.__closure__[0].cell_contents) # here is the hidden value
这是一个返回另一个函数的函数。 闭包不是变量。
闭包旨在避免使用全局变量。
注意不要错误地使用关键词。
当你知道它将使用的某个参数是常数时,你可以考虑使用闭包。