Python可变与非可变数据类型示例详解

 更新时间:2026年03月20日 09:49:18   作者:配奇  
Python中可变与不可变数据类型有显著差异,可变如列表、字典可原地修改,不可变如字符串、元组需创建新对象,这篇文章主要介绍了Python可变与非可变数据类型的相关资料,需要的朋友可以参考下

Python可变与非可变数据类型

引用变量

在大多数编程语言中,值的传递通常可以分为两种形式“值传递与引用(地址)传递”,但是在Python中变量的传递基本上都是引用(地址)传递。

变量在内存底层的存储形式

a = 10

第一步: 在计算机内存中创建一个数值为10(占用一块内存空间)

第二步: 在栈空间中声明一个变量,如a

第三步: 把数值10的内存地址赋予给变量a,形成所谓的"引用关系"

变量的引用关系

使用内置方法id(),其参数就是要显示的变量信息,id(变量名称)查询内存地址

a = 10
print(id(a))

把一个变量赋予给另一个变量

a = 10
b = a
print(id(a))
print(id(b))

运行结果:

说明: 由以上运行结果可知, 当我们把一个变量赋予给另外一个变量时, 其两者指向的内存地址相同. 可知a和b指向了同一块内存空间,原理图如下:

若b =a 以后, 改变了变量a的值, 变量是否会改变呢

a = 10
b = a

a = 100
print(b)  # 10 或 100

print(id(a))
print(id(b))

运行结果:

原理图:

总结:不可变数据类型(数值)在赋值以后, 其中一个值的改变不影响另外一个变量,因为两者指向空间地址不同

可变和非可变数据类型

数据类型

Python中一共有7种数据类型: 数值(int整型, float浮点类型) , bool类型(True和False) , 字符串类型(str) , 元组(tuple) , 列表(list[1, 2, 3]) , 字典(dict {key:value}) , 集合(set {1, 2})

将以上7种数值类型分为两大类型:可变类型 和 非可变类型

可变类型:内存一旦固定,其值就不能发生改变

  • 数值(int整型、float浮点类型)
  • bool类型(True和False)
  • 字符串类型(str)
  • 元组(tuple 1,2,3)

**不可变类型:**内存地址一旦固定,其值是可以发生改变

  • 列表(list [1, 2, 3])
  • 字典(dict {key:value})
  • 集合(set {1, 2})

判断数据类型是可变型还是非可变型

在Python中,可变类型与非可变类型主要是通过这个数据类型在内存中的表现形式来进行定义的

可变类型就是在内存中,其内存地址一旦固定,其变量的值是可以发生改变的

a = [1, 2, 3]
print(id(a))

# 向内存中追加新数据
a.append(4)
print(id(a))

运行结果:

原理图:

非可变类型就是在内存中,内存地址一旦固定,其变量的值就没办法发生任何改变了

a = 10
print(id(a))

a = 'hello'
print(id(a))

运行结果:

原理图:

在函数中的应用

可变类型

# 定义一个函数
def func(ls):
    # 在函数内部添加元素
    ls.append('苹果')
    print(fruits)
    # ['草莓', '梨', '香蕉', '西瓜', '苹果']


# 定义一个全局变量
fruits = ['草莓', '梨', '香蕉', '西瓜']
# 调用函数
func(fruits)
# 在全局作用域内打印列表
print(fruits)
# ['草莓', '梨', '香蕉', '西瓜', '苹果']

可变类型在函数中,如果在全局或局部中对可变类型进行增删改操作, 其外部和内部都会受到影响

不可变类型

# 定义一个函数
def func(num):
    num += 1
    print(num) # 11


# 定义一个全局变量
a = 10
# 调用函数
func(a)
# 在全局作用域中打印a
print(a) # 10

不可变类型在函数中,局部和全局的改变对外部和内部都没有任何影响

总结 

到此这篇关于Python可变与非可变数据类型的文章就介绍到这了,更多相关Python可变与非可变数据类型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Pytho的HTTP交互httpx包模块使用详解

    Pytho的HTTP交互httpx包模块使用详解

    Python 的 httpx 包是一个用于 HTTP 交互的一个优秀且灵活的模块。本文进行详细的讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • Python 机器学习第一章环境配置图解流程

    Python 机器学习第一章环境配置图解流程

    机器学习是一类算法的总称,这些算法企图从大量历史数据中挖掘出其中隐含的规律,并用于预测或者分类,更具体的说,机器学习可以看作是寻找一个函数,输入是样本数据,输出是期望的结果,只是这个函数过于复杂,以至于不太方便形式化表达
    2021-11-11
  • Python常用的数据清洗方法详解

    Python常用的数据清洗方法详解

    这篇文章主要介绍了Python常用的数据清洗方法,在数据处理的过程中,一般都需要进行数据的清洗工作,如数据集是否存在重复、是否存在缺失、数据是否具有完整性和一致性、数据中是否存在异常值等,需要的朋友可以参考下
    2023-07-07
  • 对python中array.sum(axis=?)的用法介绍

    对python中array.sum(axis=?)的用法介绍

    今天小编就为大家分享一篇对python中array.sum(axis=?)的用法介绍,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • TensorFlow MNIST手写数据集的实现方法

    TensorFlow MNIST手写数据集的实现方法

    MNIST数据集中包含了各种各样的手写数字图片,这篇文章主要介绍了TensorFlow MNIST手写数据集的实现方法,需要的朋友可以参考下
    2020-02-02
  • 深入理解Python虚拟机中字典(dict)的实现原理及源码剖析

    深入理解Python虚拟机中字典(dict)的实现原理及源码剖析

    这篇文章主要介绍了在 cpython 当中字典的实现原理,在本篇文章当中主要介绍在早期 python3 当中的版本字典的实现,现在的字典做了部分优化,希望对大家有所帮助
    2023-03-03
  • python利用JMeter测试Tornado的多线程

    python利用JMeter测试Tornado的多线程

    这篇文章主要介绍了python利用JMeter测试Tornado的多线程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • 纯numpy数值微分法实现手写数字识别

    纯numpy数值微分法实现手写数字识别

    本文主要介绍了纯numpy数值微分法实现手写数字识别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Python map及filter函数使用方法解析

    Python map及filter函数使用方法解析

    这篇文章主要介绍了Python map及filter函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • python中time.ctime()实例用法

    python中time.ctime()实例用法

    在本篇内容里小编给大家整理的是一篇关于python中time.ctime()实例用法内容,有兴趣的朋友们可以跟着学习参考下。
    2021-02-02

最新评论