Python的作用域规则

Python的作用域规则主要分为以下几种:

全局作用域(Global Scope):

在程序的最外层定义的变量拥有全局作用域,它们在整个模块(即.py文件)内都是可见的。

全局变量可以在函数内部被读取,但若要在函数内部修改全局变量的值,则需要使用global关键字声明该变量为全局变量。

局部作用域(Local Scope):

在函数内部定义的变量具有局部作用域,仅在该函数内部可见和可访问。

函数执行完毕后,其内部创建的局部变量会被销毁。

如果在函数内部没有明确声明一个同名的局部变量,而直接对一个变量赋值,Python会认为这是一个新的局部变量,而不是引用全局变量。

嵌套作用域(Enclosing Scope 或 Non-Local Scope):

在Python中,还存在一种称为嵌套作用域或非局部作用域的概念,它涉及到闭包(Closure)。如果一个内部函数可以访问外部函数(非全局)的变量,那么这些变量存在于嵌套作用域中。在闭包中,即使外部函数已经返回,这些变量仍能保持存活状态并被内部函数访问。

内置作用域(Built-in Scope):

这是最底层的作用域,其中包含了所有Python内置的函数和对象,如len()、range()等。无论在任何地方,这些名称都始终可用。

总结来说,在Python中查找变量遵循LEGB原则:

Local:先搜索当前局部作用域(函数内部)。

Enclosing:如果没有找到,则搜索所有包含此函数(或生成器等)的外层作用域。

Global:再往上是全局作用域(整个模块)。

Built-in:最后搜索内置作用域。‍

全局作用域与局部作用域

# 全局作用域定义变量


global_var = "I am a global variable."

def func():

# 局部作用域定义变量

local_var = "I am a local variable."

print("Inside function: ", local_var)

print("Accessing global variable inside function:", global_var)

func() # 输出:Inside function: I am a local variable.

# Accessing global variable inside function: I am a global variable.

# 在函数外部尝试访问局部变量会导致NameError

# print(local_var) # NameError: name 'local_var' is not defined

# 若要在函数内部修改全局变量,需要使用global关键字

def modify_global():

global global_var

global_var = "Global variable modified inside function."

modify_global()

print(global_var) # 输出:Global variable modified inside function.

嵌套作用域(Non-Local)


def outer_function():

outer_var = "I'm in the enclosing scope."

def inner_function():

nonlocal outer_var

outer_var = "Modified from the inner function."

print("Inner function: ", outer_var)

inner_function()

print("Outer function after modification:", outer_var)

outer_function() # 输出:Inner function: Modified from the inner function.

# Outer function after modification: Modified from the inner function.

上述例子中,nonlocal关键字用于指示outer_var不是局部变量而是外层函数的作用域中的变量。

内置作用域


def use_builtin():

print("Length of an empty list using built-in len():", len([]))

use_builtin() # 输出:Length of an empty list using built-in len(): 0

在这个例子中,即使在函数use_builtin内部,我们也可以直接调用内置函数len()。

对于内置作用域的更多示例,我们可以展示如何使用一些Python内置函数和类型:

# 内置整数类型

print(type(1)) # 输出:

# 内置字符串类型

print(type("")) # 输出:

# 内置len()函数,计算序列长度

my_list = [1, 2, 3]

print(len(my_list)) # 输出:3

# 内置range()函数,生成一个整数序列

for i in range(5):

print(i) # 输出:0 1 2 3 4

# 内置type()函数,返回对象的类型

def my_function():

pass

print(type(my_function)) # 输出:

在上述代码中,int、str、len、range 和 type 都是内置作用域中的名称。无论在程序的哪个部分,这些名称都可以被直接访问和使用。

行动吧,在路上总比一直观望的要好,未来的你肯定会感 谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入扣群: 320231853,里面有各种软件测试+开发资料和技术可以一起交流学习哦。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

  • 25
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值