Python全栈挑战中,如何区分命名空间与作用域?

2026-06-11 08:381阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计935个文字,预计阅读时间需要4分钟。

Python全栈挑战中,如何区分命名空间与作用域?

1. 引用变量 `a` 并增加1,定义函数 `func`:pythona=1def func(): print(a)func()

2. 命名空间分为三种: 1. 内置命名空间 - Python解释器内置的命名空间,包含内置函数和常量。 2. 局部命名空间 - 函数内部定义的变量和函数。 3. 全局命名空间 - 代码块外部的变量和函数。

1、引子

a = 1 def func(): print(a) func()

函数func中,可以使用函数外的变量a,这就涉及到命名空间和作用域。

2、命名空间

命名空间分三种

1、内置命名空间 —— python解释器

  内置命名空间在python一启动的时候就可以使用

  内置的名字,启动解释器的时候,就加载进内存里

2、全局命名空间 —— 自己写得代码但不是函数中的代码

  从下到下执行代码的时候加载进内存

  存放了设置的变量名和函数名

Python全栈挑战中,如何区分命名空间与作用域?

3、内置命名空间 —— 函数

  函数内部定义的名字

  当函数调用时,才产生这个命名空间,随之函数的执行结束,这个命名空间也就消失

在局部:可以使用全局和内置命名空间的名字

在全局:可以使用内置命名空间中的名字,但是不能用局部命名空间的

在内置:不能使用全局和局部命名空间中的名字

def max(l): print("in max func") print(max([1,2,3,4]))

执行结果

正常情况下,我们可以直接使用内置的名字

但是,如果在全局定义了和内置名字一样的名字是,会使用全局的名字

多个函数,拥有多个独立的局部命名空间,不共享

3、函数的调用和地址

def input(): print("in input now!") def func(): print(input) # 打印的结果为函数的地址,并不会执行函数 func()

func → 不加括号,获取的是函数的地址

函数名()→ 调用函数

函数的内存地址()→ 调用函数

4、作用域

全局作用域 —— 作用全局 —— 内置和全局命名空间中的名字都属于全局作用域 —— gloabs()

局部作用域 —— 作用局部 —— 函数(局部命名空间中的名字属于局部作用域) —— locals()

# 在全局作用域,globals和locals一样 print(globals()) print(locals()) # 在局部作用域,globals显示全局作用域的名字,locals只显示局部作用域的名字 def func(): a = 1 b = 2 print(globals()) print(locals()) func()

globals()永远打印全局名字

locals()根据local所在位置,打印

对于全局作用域的不可变数据类型的变量,在局部作用域不可变。

如果需要修改,需要使用global参数申明

a = 1 def func1(): a += 1 # 更改全局的变量,报错local variable ‘a‘ referenced before assignment func1() a = 1 def func1(): global a a += 1 # 更改全局的变量,由于申明了global a程序可以执行 func1() print(a) # 因为申明了global,变量改变

使用global参数,更改变量的值,存在危险性。

不看函数代码时,无法知道变量是否改变。

因此,在改变全局域变量时,采取传值——返回值的方式进行

a = 1 def func(a): a = 2 return a a = func(a) print(a)

本文共计935个文字,预计阅读时间需要4分钟。

Python全栈挑战中,如何区分命名空间与作用域?

1. 引用变量 `a` 并增加1,定义函数 `func`:pythona=1def func(): print(a)func()

2. 命名空间分为三种: 1. 内置命名空间 - Python解释器内置的命名空间,包含内置函数和常量。 2. 局部命名空间 - 函数内部定义的变量和函数。 3. 全局命名空间 - 代码块外部的变量和函数。

1、引子

a = 1 def func(): print(a) func()

函数func中,可以使用函数外的变量a,这就涉及到命名空间和作用域。

2、命名空间

命名空间分三种

1、内置命名空间 —— python解释器

  内置命名空间在python一启动的时候就可以使用

  内置的名字,启动解释器的时候,就加载进内存里

2、全局命名空间 —— 自己写得代码但不是函数中的代码

  从下到下执行代码的时候加载进内存

  存放了设置的变量名和函数名

Python全栈挑战中,如何区分命名空间与作用域?

3、内置命名空间 —— 函数

  函数内部定义的名字

  当函数调用时,才产生这个命名空间,随之函数的执行结束,这个命名空间也就消失

在局部:可以使用全局和内置命名空间的名字

在全局:可以使用内置命名空间中的名字,但是不能用局部命名空间的

在内置:不能使用全局和局部命名空间中的名字

def max(l): print("in max func") print(max([1,2,3,4]))

执行结果

正常情况下,我们可以直接使用内置的名字

但是,如果在全局定义了和内置名字一样的名字是,会使用全局的名字

多个函数,拥有多个独立的局部命名空间,不共享

3、函数的调用和地址

def input(): print("in input now!") def func(): print(input) # 打印的结果为函数的地址,并不会执行函数 func()

func → 不加括号,获取的是函数的地址

函数名()→ 调用函数

函数的内存地址()→ 调用函数

4、作用域

全局作用域 —— 作用全局 —— 内置和全局命名空间中的名字都属于全局作用域 —— gloabs()

局部作用域 —— 作用局部 —— 函数(局部命名空间中的名字属于局部作用域) —— locals()

# 在全局作用域,globals和locals一样 print(globals()) print(locals()) # 在局部作用域,globals显示全局作用域的名字,locals只显示局部作用域的名字 def func(): a = 1 b = 2 print(globals()) print(locals()) func()

globals()永远打印全局名字

locals()根据local所在位置,打印

对于全局作用域的不可变数据类型的变量,在局部作用域不可变。

如果需要修改,需要使用global参数申明

a = 1 def func1(): a += 1 # 更改全局的变量,报错local variable ‘a‘ referenced before assignment func1() a = 1 def func1(): global a a += 1 # 更改全局的变量,由于申明了global a程序可以执行 func1() print(a) # 因为申明了global,变量改变

使用global参数,更改变量的值,存在危险性。

不看函数代码时,无法知道变量是否改变。

因此,在改变全局域变量时,采取传值——返回值的方式进行

a = 1 def func(a): a = 2 return a a = func(a) print(a)