详解Python 中的命名空间、变量和范围

yizhihongxing

详解Python 中的命名空间、变量和范围

Python 是一门动态类型的语言,它的变量具有强大的动态特性。Python 中的变量实际上是一个指向对象的标识符,它拥有命名空间和范围。

命名空间

Python 中的命名空间指的是存储变量名称和其所指向的对象的对应关系的数据结构。命名空间可以是内置命名空间、全局命名空间和局部命名空间。

内置命名空间

内置命名空间是在 Python 解释器启动时创建的,其中包含了 Python 的内置函数和内置模块。内置命名空间是全局可用的。可以使用 dir(__builtins__) 命令来查看所有内置函数和变量。

全局命名空间

全局命名空间指的是在模块顶部定义的变量和函数的命名空间。它在执行模块时创建,并在模块生命期内一直存在。全局命名空间对于整个模块都是可见的,可以在函数中通过 global 关键字声明一个变量为全局变量。如果变量没有在函数中声明为全局变量,则它被视为局部变量。

局部命名空间

函数的局部命名空间指的是在函数体内定义的变量和函数的命名空间。它只在函数被调用时创建,并且在函数返回后被销毁。当使用 globalnonlocal 关键字在函数中声明变量时,变量将被视为全局或非局部变量。

以下示例演示了不同命名空间之间的影响:

a = 10  # 全局命名空间中的变量

def foo():
    a = 5  # 局部命名空间中的变量
    print("局部命名空间中的 a :", a)

foo()
print("全局命名空间中的 a :", a)

上述示例先定义了一个全局变量 a,然后在 foo 函数中重新定义了一个局部变量 a,最后输出两个变量。运行结果如下:

局部命名空间中的 a : 5
全局命名空间中的 a : 10

变量

Python 中的变量是一个可以改变的标识符,它代表了一个内存地址,指向存储在此地址处的值。

动态类型变量

Python 中的变量是动态类型的,这意味着它们的类型在运行时根据值动态推断。变量的类型可以随时更改,而不需要提前声明它的类型。

以下示例在运行时演示了变量的动态类型:

a = 10
print(a, type(a))  # 输出 10 <class 'int'>

a = "hello"
print(a, type(a))  # 输出 hello <class 'str'>

上面的代码演示了变量 a 的类型可以从整数变为字符串,这是动态类型变量的一种特性。

变量赋值

Python 中的变量赋值操作并不是将一个值复制到一个变量中,而是将这个变量绑定到一个对象(值的引用)。因此,当一个变量被赋予一个新的值时,它实际上是引用了一个新的对象地址。

以下示例演示了变量赋值的特性:

a = [1, 2, 3]  # 变量 a 引用了一个列表对象
b = a  # 变量 b 引用了与变量 a 相同的对象地址
b.append(4)  # 修改变量 b 引用的对象

print("变量 a 引用的对象:", a)
print("变量 b 引用的对象:", b)

上述代码中,变量 ab 分别引用了相同的列表对象。当修改变量 b 引用的对象时,变量 a 引用的列表对象也会发生变化。运行结果如下:

变量 a 引用的对象: [1, 2, 3, 4]
变量 b 引用的对象: [1, 2, 3, 4]

范围

Python 中的范围指的是变量的可见性。Python 中的范围可以分为四种:内置作用域、全局作用域、局部作用域和闭包作用域。

内置作用域

内置作用域是全局的范围。Python 解释器在执行代码之前会构建内置作用域,其中包含所有内置函数和变量。这些函数和变量可以在程序中的任何位置访问。

以下示例展示了内置作用域中的变量和函数:

import builtins

dir(builtins)  # 查看所有内置函数和变量

全局作用域

全局作用域是在模块顶部定义的变量和函数的范围。全局作用域对于整个模块都是可见的。

以下示例演示了全局范围:

a = 10  # 全局变量

def func():
    print("a 的值是:", a)

func()  # 输出 a 的值是:10

局部作用域

局部作用域是函数中定义的变量和函数的范围。只有在函数内部定义的变量可以访问该函数。局部作用域可以包含内置作用域和全局作用域。

以下示例演示了局部作用域:

def func():
    b = 5  # 局部变量
    print("在函数中的 b :", b)

func()  # 输出在函数中的 b :5

print(b)  # 报错:NameError: name 'b' is not defined

在上述代码中,变量 b 是一个局部变量,只能在函数内部访问。在函数之外访问变量 b 将引发 NameError 错误。

闭包作用域

闭包作用域是嵌套函数中的范围。如果内部函数引用了外部函数定义的变量,则该变量将被包含在闭包作用域中。

以下示例演示了闭包作用域:

def outer_func(a):
    def inner_func():
        print("在内部函数中的 a :", a)

    return inner_func

new_func = outer_func(10)
new_func()  # 输出在内部函数中的 a :10

在上述代码中,函数 outer_func 返回内部函数 inner_func 的引用。该函数引用并打印了变量 a,该变量由外部函数 outer_func 定义。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Python 中的命名空间、变量和范围 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • 在python中实现对list求和及求积

    以下是详细讲解“在Python中实现对List求和及求积”的完整攻略。 在Python中,可以使用内置函数sum()和reduce()实现对List求和及求积。本文将介这两种方法,并提供两个示例说明。 方法一:使用sum()函数求和 可以使用内置函数sum()实对List求和例如: lst = [1, 2, 3, 4, 5] s = sum(lst) pri…

    python 2023年5月13日
    00
  • Python爬虫包 BeautifulSoup  递归抓取实例详解

    下面开始详细讲解“Python爬虫包 BeautifulSoup 递归抓取实例详解”。 1. 前言 为了更好的理解本文内容,你需要有一定的 Python 编程基础和 HTML 基础。如果你还不了解,可以先去了解一下。 在本文中,我们将使用 BeautifulSoup 这个 Python 爬虫包来实现递归抓取目标数据的功能。递归抓取的含义是:不断的按照某一规律…

    python 2023年5月14日
    00
  • Pandas之read_csv()读取文件跳过报错行的解决

    当使用pandas的read_csv()方法读取文件时,有时候会出现一些行无法正确的被转换为DataFrame对象的情况,此时可能会出现报错或者丢失数据的情况。本文将介绍如何通过读取CSV文件时跳过报错行,从而更好的处理文件。 1. 使用Python内置的csv模块进行文件处理 一个常见的场景是,读取的CSV文件有某些问题,不能按照标准格式读取,导致报错。这…

    python 2023年5月13日
    00
  • Python内建数据结构详解

    Python内建数据结构详解 Python是一门高级编程语言,它提供了多种内建的数据结构,使得开发者能够更加方便地处理各种数据。在本文中,我们将介绍以下几种Python内建的数据结构: 列表(Lists) 元组(Tuples) 集合(Sets) 字典(Dictionaries) 列表(Lists) 列表是Python中最常用的数据结构之一,它可以存储任何类型…

    python 2023年5月14日
    00
  • python将unicode和str互相转化的实现

    将 unicode 转换为 str: 在 Python 3.x 中,默认的字符串类型为 UTF-8 编码的 Unicode 字符串。我们可以通过 str() 函数将 Unicode 字符串转换为普通的字符串类型。示例代码如下: #定义Unicode字符串 unicode_str = ‘你好,世界!’ #转换为字符串类型 str_str = str(unico…

    python 2023年5月31日
    00
  • Python自动化之批量生成含指定数据的word文档

    下面是Python自动化之批量生成含指定数据的word文档的完整攻略。 目录 准备工作 安装所需库 创建word文档模板 读取并替换指定数据 批量生成含指定数据的word文档 示例说明 总结 准备工作 在进行自动化生成含指定数据的word文档前,需要准备工作如下: 确定生成的文档的结构、样式和格式,以便后续创建文档模板时使用。 确定要替换的指定数据,并将这些…

    python 2023年5月18日
    00
  • pip报错“ModuleNotFoundError: No module named ‘pip._vendor.requests.adapters’”怎么处理?

    当使用pip安装Python包时,可能会遇到“ModuleNotFoundError: No module named ‘pip._vendor.requests.adapters’”错误。这个错误通常是由以下原因之一引起的: pip版本过低:如果pip版本过低,则可能会出现此错误。在这种情况下,需要升级pip版本。 pip安装文件损坏:如果pip安装文件损…

    python 2023年5月4日
    00
  • python requests指定出口ip的例子

    在进行爬虫开发时,我们可能需要使用Python的requests库来爬取网站数据。有时候,我们需要指定出口IP来避免被封禁或者限制。本文将介绍如何使用Python requests库指定出口IP,并提供两个示例。 实现步骤 步骤一:安装requests库和fake_useragent库 在Python中,我们可以使用pip命令安装requests库和fake…

    python 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部