python数据类型可变与不可变深入分析

yizhihongxing

Python数据类型可变与不可变深入分析

在 Python 中,每一个对象都有其类型,一个变量的数据类型即为所存储对象的类型。Python 中的数据类型可以分为可变和不可变两种类型,本篇文章将深入分析这两种数据类型的区别。

可变数据类型

可变数据类型是指数据类型中的元素可被修改。Python 中的可变数据类型有 listdictsetbytearray 等。

举例来说,我们先声明一个列表 lst

lst = [1, 2, 3, 4, 5]

列表中的元素可以通过索引进行修改:

lst[0] = 6
print(lst) #[6, 2, 3, 4, 5]

再看一个字典 dict

dict_1 = {'name' : 'Alice', 'age' : 22}

字典中的元素可通过键进行修改:

dict_1['name'] = 'Bob'
print(dict_1) #{'name': 'Bob', 'age': 22}

不可变数据类型

不可变数据类型是指数据类型中的元素不可被修改。Python 中的不可变数据类型有 intfloatstrtupleboolfrozenset 等。

我们先声明一个字符串 str1

str1 = 'hello'

字符串中的元素不可被修改:

str1[0] = 'H' # TypeError: 'str' object does not support item assignment

再看一个元组 tuple

tuple_1 = (1, 2, 3)

元组中的元素也不可被修改:

tuple_1[0] = 4 # TypeError: 'tuple' object does not support item assignment

可变数据类型和不可变数据类型的区别

从上面的例子中,我们可以看出主要区别在于在进行修改后,原对象内存地址的变化。

不可变类型,在修改值的时候会开辟一个新的空间,来存放新的值,不会对原来的空间产生影响,返回的是一个新的地址。下面是一个例子,我们先将字符串str1 变量的内存地址打印出来:

str1 = 'hello'
print(id(str1)) #140460445576496

然后进行修改:

str1 += ', world'
print(str1) #hello, world
print(id(str1)) #140460445577200

我们再次打印出 str1 的内存地址,可以发现与之前相差了704。因为在上一个位置的空间中已经没有 str1, world,该字符串已经被分配了一个新空间。

可变类型,修改一个元素,它的内存地址不会发生变化。下面是一个例子:

lst_2 = [1, 2, [3, 4], 5]
lst_2[2][0] = 7
print(lst_2) #[1, 2, [7, 4], 5]

我们看到,在修改列表中嵌套列表的时候,该嵌套列表在原址修改。这是因为开辟新的空间需要更多的时间,我们希望能够在一个原址中完成就可以了。

综上所述,我们了解了 Python 中的可变和不可变数据类型的区别,掌握这种差异有助于编写出更高效的代码

示例1

这是一个修改列表的例子:

lst = [1, 2, 3, 4, 5]

id_org = id(lst)

lst[0] = 6

id_new = id(lst)

print(id_org, id_new)

运行结果如下:

4355091328 4355091328

我们可以看出在列表的某一元素进行修改,其原地址是不变的。

示例2

这是一个修改字符串的例子:

str1 = 'hello'

id_org = id(str1)

str1 += ', world'

id_new = id(str1)

print(id_org, id_new)

运行结果如下:

4566203248 4566203440

我们可以看到在字符串的某一元素进行修改,其原地址是变化的,是开辟了新的内存空间。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python数据类型可变与不可变深入分析 - Python技术站

(0)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • 如何基于Python创建目录文件夹

    要基于Python创建目录文件夹,你可以运用Python内置的os模块或pathlib模块。下面将详细讲解两种方法: 1. 使用os模块创建文件夹 1.1 导入模块 import os 1.2 创建文件夹 可以使用os.mkdir()函数来创建单个文件夹,例如: os.mkdir(‘test_dir’) 如果要创建多层文件夹,则需要使用os.makedirs…

    python 2023年6月2日
    00
  • python使用正则表达式匹配txt特定字符串(有换行)

    以下是“Python使用正则表达式匹配txt特定字符串(有换行)”的完整攻略: 一、问题描述 在处理文本数据时,我们经常需要使用正则表达式来匹配特定的字符串。但是,如果文本中包含换行符,我们需要使用特殊的正则表达式来匹配这些字符串。本文将介绍如何使用Python和正则表达式来匹配txt文件中的特定字符串,包括有换行的情况。 二、解决方案 2.1 读取txt文…

    python 2023年5月14日
    00
  • Python中json格式数据的编码与解码方法详解

    Python中json格式数据的编码与解码方法详解 什么是JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,也易于机器解析和生成。JSON格式数据主要用于前后端数据传输,具有体积小、易于解析、易于传输的特点。 在Python中,可以通过json模块对JSON格式数据进行编码和解码。 JSO…

    python 2023年5月31日
    00
  • 在 Windows 上的 fabfile 中使用 activate_this.py 激活 python 虚拟环境

    【问题标题】:Activate a python virtual environment using activate_this.py in a fabfile on Windows在 Windows 上的 fabfile 中使用 activate_this.py 激活 python 虚拟环境 【发布时间】:2023-04-04 17:10:02 【问题描述…

    Python开发 2023年4月6日
    00
  • 一行代码让 Python 的运行速度提高100倍

    当我们需要处理一些大规模数据时,Python 在速度上表现往往不如 C++ 或 Java 等编程语言。但是,Python 的一个特性是它允许用户使用外部库,其中一些外部库是用 C++ 或其他高效编程语言编写的。这使得 Python 中的代码可以非常高效,甚至可以接近 C++ 中的代码。因此,使用这些外部库的内置函数,可以使 Python 代码在一些情况下运行…

    python 2023年6月6日
    00
  • 20个常用Python运维库和模块

    下面是“20个常用Python运维库和模块”的完整实例教程。 1. requests requests 是一个常用的 HTTP 库,用于向 Web 服务发送 HTTP/1.1 请求。安装 requests 可以使用 pip: pip install requests import requests # 发送 GET 请求 response = request…

    python 2023年5月13日
    00
  • Python实现的快速排序算法详解

    以下是关于“Python实现的快速排序算法详解”的完整攻略: 简介 快速排序是一种常见的排序算法,它的时间复杂度为O(nlogn)。在本教程中,我们将介绍如何使用Python实现快速排序算法,包括快速排序的基本原理、快速排序的实现方法、快速排序的优化等。 快速排序的基本原理 快速排序的基本原理是通过分治的思想将一个大问题分解为多个小问题,并将小问题的解合并成…

    python 2023年5月14日
    00
  • Python Dtrace 已修补,但运行测试脚本时仍出现“无效的探针说明符”

    【问题标题】:Python Dtrace patched, but still getting “invalid probe specifier” running test scriptsPython Dtrace 已修补,但运行测试脚本时仍出现“无效的探针说明符” 【发布时间】:2023-04-06 19:47:01 【问题描述】: 我用Issue 134…

    Python开发 2023年4月7日
    00
合作推广
合作推广
分享本页
返回顶部