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

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日

相关文章

  • mod_wsgi下的psp(python服务器页面)代码?

    【问题标题】:psp (python server pages) code under mod_wsgi?mod_wsgi下的psp(python服务器页面)代码? 【发布时间】:2023-04-07 04:05:01 【问题描述】: 有没有办法在 apache + mod_wsgi 下运行 .psp(python 服务器页面)代码?虽然我们正在转向更新的基…

    Python开发 2023年4月8日
    00
  • 正则表达式(regular)知识(整理)

    以下是详细讲解“正则表达式(regular expression)知识(整理)”的完整攻略,包括正则表达式的介绍、基本语法、元字符常用函数、两个示例说明和注意事项。 正则表达式的介绍 正则表达式是一种用于匹配字符串模式,它可以用于搜索、替换和验证字符串。正则表达式在计算科学中有着广泛的应用,如文本编辑器、搜索引擎、数据抽取领域。 正则表达式基本语法 正则表达…

    python 2023年5月14日
    00
  • Python 中的 Counter 模块及使用详解(搞定重复计数)

    Python 中的 Counter 模块及使用详解 Counter 是 Python 中的一个内置模块,它提供了一种方便的方式来进行重复计数。Counter 可以接受任可代对象作为输入,并返回一个字典,其中包含每个元素的计数。在本文中,我们将详细介绍 Counter 模块的使用方法,并提供一些示例说明。 Counter 模块的基本用法 Counter 模块的…

    python 2023年5月14日
    00
  • Python3的unicode编码转换成中文的问题及解决方案

    我来为您详细讲解“Python3的unicode编码转换成中文的问题及解决方案”的完整攻略。 问题描述 当使用 Python3 编写程序时,我们有时会遇到需要将 unicode 编码的字符串转换成中文字符的问题。比如,我们从数据库中读取的某些数据是以 unicode 编码保存的,我们需要将这些数据转换成中文字符后再进行处理。 解决方案 Python3 中提供…

    python 2023年5月31日
    00
  • Python3.9新特性详解

    Python3.9新特性详解 Python 3.9是Python语言的最新版本,该版本包含了许多有用的新特性和改进。本篇文章将详细讲解Python 3.9的新特性。 操作符模块 Python 3.9引入了一个名为”operator”的内置模块,该模块提供了一组函数,用于对Python中的操作符进行操作。这些函数包括: operator.add(a, b):返…

    python 2023年5月13日
    00
  • Python QT组件库qtwidgets的使用

    下面是关于Python QT组件库qtwidgets的使用的完整攻略。 1. QT Widgets QT Widgets是QT框架中用于创建GUI的工具箱。QT Widgets包含了丰富的控件、布局等组件,非常适用于创建基于桌面的应用程序。 QT Widgets的使用需要先安装QT库,安装后即可在Python中使用PyQt库对QT Widgets进行调用。 …

    python 2023年6月3日
    00
  • 在 python 脚本中使用 mitmproxy

    【问题标题】:Using mitmproxy inside python script在 python 脚本中使用 mitmproxy 【发布时间】:2023-04-03 00:44:01 【问题描述】: 我是 mitmproxy 的新手。但我不知道如何在 python 脚本中使用它。 我想将 mitmproxy 放入我的 python 脚本中,就像一个库一…

    Python开发 2023年4月8日
    00
  • Python学习之私有函数,私有变量及封装详解

    Python学习之私有函数、私有变量及封装详解 一、私有函数和私有变量 在Python中,我们可以使用下划线(_)来表示一个函数或者变量是“私有”的(private)。所谓的“私有”就是说,只有在类内部才能够访问这些函数或者变量,在类外部是无法直接访问的。例如: class MyClass: def __init__(self): self.__privat…

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