
某个特定变量, 其可被访问以及修改的程序位置, 是由作用域来决定的。理解作用域, 能够防止意外的数据修改, 并且能让你的代码逻辑, 在程序变得越发复杂时, 更便于推理。在本章中我们将探索 中的局部作用域和全局作用域概念。1. 局部变量 (Local )函数内部所定义之地变量乃是局部变量, 其作用域被极为严格地限定在那个定义它的函数内部, 这就表意着唯能于该函数内部对这个变量进行访问以及修改, 一旦函数执行完毕, 此局部变量便会被销毁, 其所具的值也就不再能够为之访问了。1.1 局部变量示例def my_function(): # x 是一个局部变量 x 10 print(函数内部 x 的值为:, x) my_function() # 下面这行代码会导致错误因为 x 在函数外部未定义 # print(函数外部 x 的值为:, x)在此番示例当中, x属于内部的一个局部变量, 当你试着于函数外部去访问它的时候, 便会抛出报错, 这是由于此刻x已然超出了其作用域。2. 嵌套函数中的作用域若你运用了嵌套函数, 即在一个函数的内部定义了另外一个函数, 那么内层的函数能够去访问外层函数作用域当中的变量, 然而外层的函数却不能够去访问内层函数所定义的变量。def outer_function(): # outer_var 对于 outer_function 来说是局部变量 outer_var 20 def inner_function(): # inner_var 对于 inner_function 来说是局部变量 inner_var 30 # inner_function 可以访问 outer_var print(在 inner_function 内部访问 outer_var 的值:, outer_var) print(在 inner_function 内部访问 inner_var 的值:, inner_var) inner_function() # 下面这行代码会导致错误因为 inner_var 在 outer_function 的作用域中未定义 # print(在 inner_function 外部访问 inner_var 的值:, inner_var) outer_function()处于这种情形下, 能够进行访问, 鉴于它是于的封闭作用域scope里被定义的。可是, 不能够进行访问, 由于它仅仅是在的局部作用域中被定义的。3. 局部变量遮蔽 ( Local )要是存在一个局部变量, 且它和一个全局变量有着一样的名字, 那么在函数所具有的作用域范围里头, 此局部变量会对那个全局变量形成遮蔽的情况, 这所表达的意思是处在函数内部之时, 程序会优先使用那个局部变量。global_var 5 def my_function(): # 全局变量 global_var 被同名的局部变量遮蔽了 global_var 15 print(函数内部 global_var 的值为:, global_var) my_function() print(函数外部 global_var 的值为:, global_var)这里的输出结果将是函数内部 global_var 的值为: 15 函数外部 global_var 的值为: 5于内部之时, 其所指向者乃那个局部变量, 故而其值为十五。而于函数外部之际, 其指向依旧是全局变量, 所以其值维持为五。4. 全局变量 ( )全局变量, 是于任何函数之外部所定义的变量, 其作用域为整个程序, 这意谓着, 你能够在代码的任何一处地方, 包含函数的内部, 去访问并修改它。4.1 全局变量示例# global_variable 是一个全局变量 global_variable 100 def my_function(): print(函数内部 global_variable 的值为:, global_variable) my_function() print(函数外部 global_variable 的值为:, global_variable)在这个例子中在 的内部和外部都是可以被访问的。5. 在函数内部修改全局变量即使函数能够直接去访问全局变量, 然而要是你打算于函数的内部对其施行修改操作, 那么势必要运用关键字。要是不运用关键字, 当你试着给同名变量赋予值的时候, 就会将其视作在函数作用域范围里创建了一个全新的局部变量, 就如同我们在之前的“局部变量遮蔽”那一片段所看到的情况那般。global_variable 200 def modify_global(): global global_variable # 声明我们想要使用的是全局变量 global_variable 300 print(在 modify_global 内部 global_variable 的值为:, global_variable) modify_global() print(在 modify_global 外部 global_variable 的值为:, global_variable)输出结果为在 modify_global 内部 global_variable 的值为: 300 在 modify_global 外部 global_variable 的值为: 300靠着运用关键字, 咱俩确切地告知, 我们打算于函数内部去改动那名为的全局变量。6. 何时使用全局变量虽然全局变量在某些时候具备一定便利性, 然而应当尽可能减少其使用, 过度运用全局变量会致使代码在理解、调试以及维护方面出现困难, 以下是一些适用于全局变量使用的普遍准则:7. 关键字关键字在嵌套函数里被使用, 其专门用以引用, 那是**最近的封闭作用域并非是全局的**当中的变量。要是你打算于一个内层函数之中去修改外层函数作用域里面的变量, 然而又不希望在内层函数之内创建全新的同名局部变量, 那么这个关键字便会发挥作用了。7.1 示例def outer_function(): outer_var 10 def inner_function(): nonlocal outer_var # 引用来自封闭作用域的 outer_var outer_var 20 print(在 inner_function 内部 outer_var 的值为:, outer_var) inner_function() print(在 outer_function 内部 outer_var 的值为:, outer_var) outer_function()输出结果在 inner_function 内部 outer_var 的值为: 20 在 outer_function 内部 outer_var 的值为: 20若是不加以使用, 那么便会去创建一个称谓为 的全新局部变量。借由进行使用, 我们达成了对归属于 作用域的 实施修改。8. 实际案例与演示让我们来看一些更复杂的例子以巩固我们的理解。8.1 案例 1计算带折扣的总价discount_rate 0.1 # 用于折扣率的全局变量 def calculate_price(price, quantity): 计算应用折扣后的总价。 global discount_rate # 使用全局变量 (注如果仅仅是读取而不修改这行其实可以省略) # 应用折扣 discount price * discount_rate final_price (price - discount) * quantity return final_price # 示例用法 price 100 quantity 5 total_price calculate_price(price, quantity) print(总价为:, total_price) # 输出: 450.0在这个例子里头, 存在着一个全局变量, 函数运用了这个全局变量去计算折扣。8.2 案例 2使用 实现计数器def counter(): count 0 # 这是一个封闭在 counter 中的变量 def increment(): nonlocal count count 1 return count return increment # 创建一个计数器实例 my_counter counter() # 多次调用 increment 函数 print(my_counter()) # 输出: 1 print(my_counter()) # 输出: 2 print(my_counter()) # 输出: 3于此处, 函数自身被返回了, 此在相关情境里被称作闭包。每次对该函数进行调用, 所执行的实质是函数内部的代码, 此时, 包含于函数封闭作用域内的count变量会被改变。要是不存在特定条件, 每次运行时都会去创建一个新的count局部变量, 如此一来, 这个计数器便无法正常实现累加操作了。