全局变量声明

时间:2018-03-08 11:15:44

标签: python function scope global-variables

我是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”,然后根据我的理解在调用机箱功能时应该在最后打印出来(所以我希望全局,本地,本地..)。

那我的思维错误在哪里?

4 个答案:

答案 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)

实际上,您有两个变量,为清楚起见,我添加了后缀12

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

这是一个返回另一个函数的函数。 闭包不是变量。

闭包旨在避免使用全局变量。

注意不要错误地使用关键词。

当你知道它将使用的某个参数是常数时,你可以考虑使用闭包。