返回顶部
首页 > 资讯 > 后端开发 > Python >Python中可变和不可变对象的详细介绍
  • 218
分享到

Python中可变和不可变对象的详细介绍

2023-06-20 18:06:58 218人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章主要介绍“python中可变和不可变对象的详细介绍”,在日常操作中,相信很多人在Python中可变和不可变对象的详细介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python中可变和不可变对象的详

这篇文章主要介绍“python中可变和不可变对象的详细介绍”,在日常操作中,相信很多人在Python中可变和不可变对象的详细介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python中可变和不可变对象的详细介绍”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

目录
  • 前置知识

  • 有哪些可变对象,哪些不可变对象?

  • 不可变对象和可变对象的区别?

    • 不可变对象的应用场景

  • 从内存角度出发说下有什么区别?

    • 不可变对象

    • 可变对象

  • 从代码角度看看区别

    • 不可变对象-整型

    • 不可变对象-字符串

    • 不可变对象-元组

    • 可变对象列表

  • Python 函数的参数传递

    • 概念

    • 参数传递不可变对象

    • 参数传递可变对象

  • 总结

    前置知识

    在 Python 中,一切皆为对象

    Python 中不存在值传递,一切传递的都是对象的引用,也可以认为是传址 

    有哪些可变对象,哪些不可变对象?

    不可变对象:字符串、元组、数字(int、float)

    可变对象:数组、字典、集合 

    不可变对象和可变对象的区别?

    可变对象:改变对象内容,对象在内存中的地址不会被改变

    不可变对象:改变对象内容,对象在内存中的地址会被改变;如果必须存储一个不同的值,则必须创建新的对象 

    不可变对象的应用场景

    它们在需要常量哈希值的地方起着重要作用,例如作为字典中的键

    从内存角度出发说下有什么区别?

    不可变对象

    Python中可变和不可变对象的详细介绍

    Python 中的变量有一个内存空间

    具体的数据(对象)也有一个内存空间

    而变量保存(指向)的是存储数据(对象)的内存地址,一般也叫对象引用

    不可变对象是指对象内容本身不可变

    变的是:改变了值,会创建新对象,然后变量改变了对象引用,指向了新对象,旧对象会被垃圾回收

    可变对象

    Python中可变和不可变对象的详细介绍

    变的是:原来对象的内容,不会创建新对象,而变量也还是指向原对象

    从代码角度看看区别

    不可变对象-整型

    a = 123b = aprint(id(a))print(id(b))print(a, b)a += 2print(id(a))print(id(b))print(a, b)# 输出结果44739569124473956912123 12344739569764473956912125 123

    从前两次打印可以看到,a、b 变量保存的内存地址是同一个,他们们都保存了 123 的内存地址(123 对象的引用)

    预期情况:在 a 做了加法赋值运算之后,既然他们一开始都是指向同一个内存地址,按道理修改 123 后,他们也应该仍然指向同一个内存地址呀,但是并没有!

    实际情况:a 指向了新的内存地址,而 b 仍然指向旧的内存地址,所以他们的值也不一样 

    可以看看下面的图

    首先,这是一个内存区域

    Python中可变和不可变对象的详细介绍

    原理

    因为数字(int、float) 是不可变对象,所以不能在 123 的内存地址上直接修改数据

    加法赋值,实际上是将原来的 123 复制了一份到新的内存地址,然后再做加法,得到一个新的值 125,最后 a 再指向新的内存地址

    不可变对象-字符串

    a = "test"b = aprint(id(a))print(id(b))print(a, b)a += "123"print(id(a))print(id(b))print(a, b)# 输出结果44553453924455345392test test44558182884455345392test123 test

    不可变对象-元组

    a = (1, 2, 3)b = aprint(id(a))print(id(b))print(a, b)a = a + aprint(id(a))print(id(b))print(a, b)# 输出结果44554102404455410240(1, 2, 3) (1, 2, 3)44553592004455410240(1, 2, 3, 1, 2, 3) (1, 2, 3)

    可变对象列表

    # 列表a = [1, 2, 3]b = aprint(id(a))print(id(b))print(a, b)a += [4, 5, 6]print(a, b)print(id(a))print(id(b))# 输出结果43276658564327665856[1, 2, 3, 4, 5, 6] [1, 2, 3, 4, 5, 6]43276658564327665856

    能看到 a 变量修改值之后,b 的值也随之修改了

    可以看看下面的图

    Python中可变和不可变对象的详细介绍 

    因为 list 是不可变对象,所以并不会将原来的值复制到新的内存地址再改变,而是直接在原来的内存地址上修改数据
    因为 a、b 都是指向原来的内存地址的,所以 a、b 变量保存的内存地址是一致的(对象引用是一致的),当然值也是一样的啦 

    Python 函数的参数传递

    这里先提前讲下函数的入门,因为参数传递是个挺重要的点

    概念

    开头有讲到,Python 的一切传递都是对象的引用,函数参数传递也不例外

    当传递给函数的是一个变量,实际上传递的是变量保存的对象引用(变量指向的内存地址)

    在函数内部修改变量时,会根据变量指向的内存地址,去修改对应的值才对,事实真是如此吗

    参数传递不可变对象

    # 函数def test_no_define(age, name):    age = 123    name = "poloyy"    print(age, name)age = 1name = "yy"print(age, name)test_no_define(age, name)print(age, name)# 输出结果1 yy123 poloyy1 yy

    参数传递可变对象

    # 函数def test_define(dicts, sets):    dicts['age'] = 24    sets.pop()    print(dicts, sets)dicts = {"age": 123}sets = {1, 2}print(dicts, sets)test_define(dicts, sets)print(dicts, sets)# 输出结果1 yy{'age': 123} {1, 2}{'age': 24} {2}{'age': 24} {2}

    总结

    当函数参数传递的变量是不可变对象的时候,函数内改变变量值,函数外的变量不会随之改变

    当函数参数传递的变量是可变对象的时候,函数内改变变量值,函数外的变量会随之改变

    到此,关于“Python中可变和不可变对象的详细介绍”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

    --结束END--

    本文标题: Python中可变和不可变对象的详细介绍

    本文链接: https://lsjlt.com/news/299257.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • Python中可变和不可变对象的详细介绍
      这篇文章主要介绍“Python中可变和不可变对象的详细介绍”,在日常操作中,相信很多人在Python中可变和不可变对象的详细介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python中可变和不可变对象的详...
      99+
      2023-06-20
    • Python中的可变对象和不可变对象
      什么是可变/不可变对象 不可变对象,该对象所指向的内存中的值不能被改变。当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址。 可变对象,该对象所指向的内存中的...
      99+
      2023-01-30
      对象 Python
    • Python 的可变和不可变对象详情
      目录Python 中的可变和不可变对象一、文字描述可变和不可变对象1、可变与不可变对象归类2、可变与可变对象的区别3、不可变对象的应用场景二、代码角度区别1、不可变对象-整型2、不可...
      99+
      2024-04-02
    • python可变对象,不可变对象详解
      在写python程序时,对于可变对象和不可变对象这里理解不深,导致总会犯一些细节错误。以下面的程序举例: ab = {'a':1, 'b':2} list1 = [] for i...
      99+
      2024-04-02
    • python可变对象和不可变对象的解释
      数据类型分为可变、不可变。可变对象表示可以原处修改该数据对象,不可变对象表示必须创建新对象来保存修改后的数据。 在基础数据类型中: 数值、字符串、元组、frozenset是不可变对象 列表、set、dict是可变对象 对于可变对象,...
      99+
      2023-01-30
      对象 python
    • Python的基本类型介绍和可变不可变
      Python的基本类型介绍 前言   做python有一段时间了,从工作开始就在不断地学习和积累。但是有时候用到一些技术点,甚至是基础知识的时候,总是会遗忘。所以,从今天开始,就在这里记录下来,不仅可以分享给大家,而且还可以帮助我来复习。...
      99+
      2023-01-30
      类型 Python
    • Python中可变和不可变对象的深入讲解
      目录前置知识 有哪些可变对象,哪些不可变对象? 不可变对象和可变对象的区别? 不可变对象的应用场景 从内存角度出发说下有什么区别? 不可变对象可变对象从代码角度看看区别 不可变对象...
      99+
      2024-04-02
    • 可变对象与不可变对象
      可变对象:   对象进行操作后,该对象内部是发生变化的   可以这样认为,操作直接作用于该对象,并使该对象发生了变化   比如list,对list进行操作,list内部的内容是会变化的   不可变对象:   对象进行操作后,该对象内部是不...
      99+
      2023-01-31
      对象
    • JavaScript可迭代对象详细介绍
      目录1、迭代器2、迭代器接口与可迭代对象3、自定义可迭代对象3.1、可迭代的Range对象3.2、使用Generator函数作为迭代器接口3.3、可迭代的List3.3、可迭代的迭代...
      99+
      2024-04-02
    • Python中可变变量与不可变变量详解
      目录一 、常见的变量分类1、变量的创建二、变量分类1、、常见的不可变变量2、常见的可变变量三、拷贝的差别四、参数传递的差别前言: C++不同于Python的显著特点,就是有指针和引用...
      99+
      2024-04-02
    • Python中不可变类型和可变类型详解
      ...
      99+
      2023-06-02
    • JavaScript对象不变性介绍
      目录1. 基本概念2. Object.freeze()3. Object.seal()4. const关键字?5. 总结1. 基本概念 对象不变性在任何编程语言中都是一个重要的概念。...
      99+
      2024-04-02
    • Python 类和对象详细介绍
      目录对象 = 属性 + 方法self是什么公有和私有继承调用未绑定的父类方法使用super函数多重继承组合构造和析构_ _init_ _(self[, …])构造方法_...
      99+
      2024-04-02
    • python中不可变的对象类型有哪些
      python中不可变的对象类型有:1、int数字类型;2、string字符串类型;3、float浮点型;4、tuple元组。具体示例分析:int数字类型,尝试修改数字对象。#新建数字对象1000>>> id(1000)53060472L#新...
      99+
      2024-04-02
    • Python变量名详细规则详细变量值介绍
      Python需要使用标识符给变量命名,其实标识符就是用于给程序中变量、类、方法命名的符号(简单来说,标识符就是合法的名称 标识符需要以字母或下划线_开头,可以和字母、数字、下划线进行...
      99+
      2024-04-02
    • Python 绘图和可视化详细介绍
      Python之绘图和可视化 1. 启用matplotlib 最常用的Pylab模式的IPython(IPython --pylab) 2. matplotlib的图像都位于Figure对象中。 可以使用pl...
      99+
      2022-06-04
      详细介绍 Python
    • 如何创建Java的不可变对象
      如何创建Java的不可变对象,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。前言:为什么 String 是 immutable 类(不可变对象)吗我想研究它,想知...
      99+
      2023-06-25
    • 创建一个Java的不可变对象
      目录01、什么是不可变类02、常见的不可变类1)常量池的需要2)hashCode 的需要3)线程安全03、手撸不可变类04、总结前言: 为什么 String 是 immutable ...
      99+
      2024-04-02
    • python的可变和不可变数据类型是什么
      这篇文章主要讲解了“python的可变和不可变数据类型是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python的可变和不可变数据类型是什么”吧!不可变数据类型python中不可变数据...
      99+
      2023-06-02
    • Android中的Looper对象详细介绍
      Java 官网对Looper对象的说明: public class Looperextends ObjectClass used to run a message loop f...
      99+
      2022-06-06
      looper Android
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作