Python可变和不可变对象

【Python】Python 可变对象和不可变对象 文章目录Python 变量Python 对象不可变对象可变对象什么是赋值引用?什么是浅拷贝(copy)?什么是深拷贝(deepcopy)?Python 参数传递是值传递还是引用传递?举个栗子????不可变对象\_外部永远不随内部变可变对象\_外部跟随内部变可变对象\_外部不随内部变 Python 变量 在 Python 中,变量都是指针;指针的内存空间与数据类型无关,其内存空间保存了指向数据的内存地址。 flowchart LR classDef varClass fill: #E6E6FA 阅读详情

Python可变和不可变对象

作者:炸鸡叔
链接:https://www.jianshu.com/p/c5582e23b26c

python中有可变对象和不可变对象:

可变对象:list,dict.

不可变对象有:int,string,float,tuple.

最近看到这些知识下面来整理一下...

1、python不可变对象:

int,string,float,tuple

先来看一个例子

def int_test(): 
    i = 77
    j = 77
    print(id(77))                  #140396579590760
    print('i id:' + str(id(i)))      #i id:140396579590760
    print('j id:' + str(id(j)))      #j id:140396579590760
    print i is j                    #True
    j = j + 1
    print('new i id:' + str(id(i)))  #new i id:140396579590760
    print('new j id:' + str(id(j)))  #new j id:140396579590736
    print i is j                    #False

if __name__ == '__main__':
    int_test()

有i和j俩个变量的值为77,通过打印77的ID和变量i,j在内存中的id我们得知它们都是指向同一块内存。所以说i和j都是指向同一个对象的。然后我们修改j的值,让j的值+1.按道理j修改之后应该i的值也发生改变的,因为它们都是指向的同一块内存,但结果是并没有。因为int类型是不可变类型,所有其实是j复制了一份到新的内存地址然后+1,然后j又指向了新的地址。所以j的内存id发生了变化。

内存分配情况如下:

python-variable-immutable-memory-assign-1.png

 

2、python可变对象:

dict,list

def dict_test():
    a = {}
    b = a
    print(id(a))
    a['a'] = 'hhhh'
    print('id a:' + str(id(a)))
    print('a:' + str(a))
    print('id b:' + str(id(b)))
    print('b:' + str(b))

if __name__ == '__main__':
    dict_test()

运行结果如下:

140367329543360

id a:140367329543360

a:{'a': 'hhhh'}

id b:140367329543360

b:{'a': 'hhhh'}

可以看到a最早的内存地址id是140367329543360 然后把a赋值给b其实就是让变量b的也指向a所指向的内存空间。然后我们发现当a发生变化后,b也跟着发生变化了,因为list是可变类型,所以并不会复制一份再改变,而是直接在a所指向的内存空间修改数据,而b也是指向该内存空间的,自然b也就跟着改变了。

内存变化如下:

python-variable-immutable-memory-assign-2.png

 

python函数的参数传递

由于python规定参数传递都是传递引用,也就是传递给函数的是原变量实际所指向的内存空间,修改的时候就会根据该引用的指向去修改该内存中的内容,所以按道理说我们在函数内改变了传递过来的参数的值的话,原来外部的变量也应该受到影响。但是上面我们说到了python中有可变类型和不可变类型,这样的话,当传过来的是可变类型(list,dict)时,我们在函数内部修改就会影响函数外部的变量。而传入的是不可变类型时在函数内部修改改变量并不会影响函数外部的变量,因为修改的时候会先复制一份再修改。下面通过代码证明一下:


def test(a_int, b_list):
    a_int = a_int + 1
    b_list.append('13')
    print('inner a_int:' + str(a_int))
    print('inner b_list:' + str(b_list))

if __name__ == '__main__':
    a_int = 5
    b_list = [10, 11]

    test(a_int, b_list)

    print('outer a_int:' + str(a_int))
    print('outer b_list:' + str(b_list))

运行结果如下:

inner a_int:6

inner b_list:[10, 11, '13']

outer a_int:5

outer b_list:[10, 11, '13']

好啦!答案显而易见啦,经过test()方法修改后,传递过来的int类型外部变量没有发生改变,而list这种可变类型则因为test()方法的影响导致内容发生了改变。

总结:

在很多的其他语言中在传递参数的时候允许程序员选择值传递还是引用传递(比如c语言加上*号传递指针就是引用传递,而直接传递变量名就是值传递),而python只允许使用引用传递,但是它加上了可变类型和不可变类型,让我们感觉有点混乱了。听说python只允许引用传递是为方便内存管理,因为python使用的内存回收机制是计数器回收,就是每块内存上有一个计数器,表示当前有多少个对象指向该内存。每当一个变量不再使用时,就让该计数器-1,有新对象指向该内存时就让计数器+1,当计时器为0时,就可以收回这块内存了。当然我觉得它肯定不止用了计数器吧,应该还有其他的技术,比如分代回收什么的。不再讨论之列,就这样了...

ps:

值传递:表示传递直接传递变量的值,把传递过来的变量的值复制到形参中,这样在函数内部的操作不会影响到外部的变量

引用传递:我个人觉得可以把引用理解为一个箭头,这个箭头指向某块内存地址,而引用传递,传递过来的就是这个箭头,当你修改内容的时候,就是修改这个箭头所指向的内存地址中的内容,因为外部也是指向这个内存中的内容的,所以,在函数内部修改就会影响函数外部的内容。

Python可变对象与不可变对象 Python里和None比较时,为什么是 is None 而不是 == None 呢? 这是因为None在Python里是个单例对象,一个变量如果是None,它一定和None指向同一个内存地址。而 == None背后调用的是__eq__,而__eq__可以被重载 立即下载

相关推荐

详细分析Python可变对象和不可变对象

主要介绍了Python可变对象和不可变对象的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下

Python中的可变对象和不可变对象详解

在Python中,每个变量都是一个对象,每个对象都具有其创建后是否允许修改的属性,这种特性称为对象的可变性。它影响对象在传递给函数、用于表达式或存储在数据结构中时的行为。定义可变对象:创建后可以改变的对象。例子包括列表、字典、集合和用户定义的对象。不可变对象:一旦创建后不允许被修改的对象。例子包括整数、浮点数、字符串、元组和冻结集合。

lph159的博客 4855

Windows下用RKDevTool解包update.img的完整流程(含常见错误排查)

本文详细介绍了在Windows系统下使用RKDevTool工具解包update.img固件的完整流程。从工具准备、环境搭建到逐步解包操作,重点解析了输出文件结构,并提供了修改分区后重新打包的实战方法。文章还针对解包失败、打包错误等常见问题提供了详细的排查与解决方案,旨在帮助嵌入式开发者和爱好者高效完成固件分析与定制工作。

aa123的博客 718

python中的可变对象,不可变对象

需要注意的是,不可变对象并不意味着对象的引用不能改变。例如,可以将一个变量从引用一个不可变对象改为引用另一个不可变对象,但是不能直接修改原始对象的值。在Python中,对象可以分为可变对象和不可变对象,它们在内存中的行为和特性有所不同。

weixin_49520696的博客 426

ASTRA Toolbox学习笔记-Python

ASTRA Toolbox 是一个用于处理 X 射线相干散射和 X 射线传输成像的开源算法工具箱。本文档概述了该工具箱的基本概念。

hou9021的博客 8261

海康威视门禁考勤设备数据对接实战:从被动推送到主动拉取

本文深入探讨了海康威视门禁考勤设备数据对接的两种核心方案:HTTP推送与SDK主动拉取。文章对比了两种方式的适用场景、技术实现与优缺点,为开发者提供了从设备配置、代码编写到工程化部署的完整实战指南,帮助读者根据项目规模、网络环境及数据稳定性要求,做出最合适的技术选型。

weixin_29284657的博客 673

Python:可变对象、不可变对象、迭代器可迭代对象

Python:可变对象、不可变对象、迭代器可迭代对象

在夜里,所有人都会失去年龄。 2128

从SolidWorks到Simscape:URDF导出模型错位的5个常见原因及修复方法

本文深入分析了从SolidWorks导出URDF模型到Simscape时出现模型错位的5个常见原因,包括坐标系定义、RPY角陷阱、轴方向统一、质量属性导出和层次结构错乱,并提供了详细的修复方法和实战技巧,帮助工程师高效解决模型错位问题。

weixin_30664051的博客 443

Python中对象可变的(mutable)和不可变的(immutable)介绍

Python中对象可变的(mutable)和不可变的(immutable)介绍

cnds123的专栏 3204

Allegro层叠中的Etch Factor-铜皮的腐蚀因子如何计算

在用Allegro进行PCB设计的时候,Cross-section中需要填入对应的信息,一般填入每层的厚度即可,如下图。当PCB需要进行仿真分析的时候,Etch-Factor这个值是必须要填写的,如下图。实际铜皮进行蚀刻的时候,Etch-Factor的值并不是标准的90度,如下图。线路层实际形状是个梯形,Etch-Factor代表的就是梯形的角度,如下图。首先输入数值,比如1,再点击Inv,最后点击tan-1,可以得到角度的值。如果tanσ=2,σ=63.4,如下图计算结果。即tanσ=1,得到σ=45。

weixin_54787054的博客 885

CDD数据库文件制作(三)——服务配置(0x10)

根据诊断调查表进行每一步配置的详细操作,与背后逻辑解释 1.会话切换配置 1.1.根据诊断调查表进行信息提取(0x1001) 1.2.会话转换配置(0x1001) 1.3.根据诊断调查表进行信息提取(0x1002) 1.4.会话转换配置(0x1002) 1.5.根据诊断调查表进行信息提取(0x1003) 1.6.会话转换配置(0x1003) 1.7.会话切换配置完成后效果图 2.安全等级配置信息提取 2.1.安全访问配置(0x1001) 2.2.安全访问配置(0x1002) 2.3.安全访问配置(0x100

LOVE135149的博客 5840

【python学习笔记】 可变对象和不可变对象详解

复习一下python 基础数据结构,大家一起多多交流,互相学习啊! Python在heap(堆:程序员自己分配释放)中分配的对象分成两类:可变对象和不可变对象。所谓可变对象是指,对象的内容可变,而不可变对象是指对象内容不可变 python中,万物皆对象

南城果宝的满腹经纶 2311

Python - 可变和不可变对象

前置知识 在 Python 中,一切皆为对象 Python 中不存在值传递,一切传递的都是对象的引用,也可以认为是传址 有哪些可变对象,哪些不可变对象? 不可变对象:字符串、元组、数字(int、float) 可变对象:数组、字典、集合 不可变对象和可变对象的区别? 可变对象:改变对象内容,对象在内存中的地址不会被改变 不可变对象:改变对象内容,对象在内存中的地址会被改变;如果必须存储一...

qq_33801641的博客 303

Windows环境下QGIS完整编译指南(从环境搭建到问题解决)

本文详细介绍了在Windows 11系统下编译QGIS 3.40.12版本的完整流程。主要内容包括:前期准备工作(系统要求、工具清单)、环境搭建(Visual Studio 2026、OSGeo4W、Qt Creator的安装配置)、以及详细的CMake参数设置。特别强调了依赖管理的重要性,并提供了解决常见编译错误的方案。该指南适用于GIS二次开发、QGIS功能定制和源码学习等场景,通过OSGeo4W工具简化了复杂的依赖管理过程,确保编译过程的可重复性。

LuckyHanMo的博客 1336

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Python中的可变对象和不可变对象

0 什么是可变/不可变对象 不可变对象,该对象所指向的内存中的值不能被改变。当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址。 可变对象,该对象所指向的内存中的值可以被改变。变量(准确的说是引用)改变后,实际上是其所指的值直接发生改变,并没有发生复制行为,也没有开辟新的出地址,通俗点说就是原地改变。 Python中,数值类...

Lavi的专栏 1071

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

python可变对象和不可变对象

   Python 在 heap 中分配的对象分成两类:可变对象和不可变对象。所谓可变对象是指,对象的内容是可变的,例如 list。而不可变的对象则相反,表示其内容不可变,例如常量7。 不可变对象 :int,string,float,tuple -- 可理解为C中,该参数为值传递 可变对象 :list,dictionary -- 可理解为C中,该参数为指针传递 一、不可变对象 由于 Python 中的变量存放的是对象引用,所以对于不可变对象而言,尽管对象本身不可变,但变量的对象

weixin_45074568的博客 2831

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

python中不可变对象_浅谈Python中的可变对象和不可变对象

什么是可变/不可变对象不可变对象,该对象所指向的内存中的值不能被改变。当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址。可变对象,该对象所指向的内存中的值可以被改变。变量(准确的说是引用)改变后,实际上是其所指的值直接发生改变,并没有发生复制行为,也没有开辟新的出地址,通俗点说就是原地改变。Python中,数值类型(int...

weixin_39658474的博客 166

python的可变和不可变对象

python的对象分为可变对象(mutable)和不可变对象(immutable) 不可变对象(immutable)包括:常数、字符串、元组和不可变集合(frozensets) 可变对象包括:列表、字典、自定义类对象(也可用特殊方法定义为不可变类) 所谓不可变对象,就是不能动态修改对象的值或成员 例如: a=1 print id(a) a+=1 print id(a) 这

BOKE 2113

Python中可变对象和不可变对象

之前写了FPGrowth的代码,写得非常恶心,觉得和C语言、C++的工程文件很不相同。其中就有关于传引用、传值的疑问。截一段Leetcode的代码这题好像是Leetcode 93附近的一道 获得二叉树最大深度的题目。我使用了dfs,本来以为python是传对象引用的,所以在dfs中更新了ans,那么返回的ans也会改变,但是最后得到的结果保持1。经过查看资料我就知道这和命名域以及可变对象和不可变对象

Mr.Phoebe的专栏 5023

python可变对象 不可变对象_【Python】可变对象和不可变对象

在 Python 中一切都可以看作为对象。每个对象都有各自的 id, type 和 value。id: 当一个对象被创建后,它的 id 就不会在改变,这里的 id 其实就是对象在内存中的地址,可以使用 id() 去查看对象在内存中地址。type: 和 id 一样当对象呗创建之后,它的 type 也不能再被改变,type 决定了该对象所能够支持的操作value: 对象的值一个对象可变与否就在于 va...

weixin_39797686的博客 76

python可变和不可变对象

python可变和不可变对象不可变类型不可变种类指向不可变对象的变量改变value可变类型可变类型种类指向可变对象的变量改变value 可变、不可变是指变量所引用的内存中的那块空间是否可以被改变。 当改变变量value时,变量原指定内存地址的值可以被改变,则为可变类型,否则为不可变类型。 改变value值的同时,使用id()函数查看变量id是否变化即可判断是什么类型。 不可变类型 不可变种类 number,str,tuple,bool 当改变变量value时,重新分配一块内存空间,使变量指向新的地址。

weixin_48668114的博客 457

python中不可变对象有哪些_浅谈Python中的可变对象和不可变对象

搜索热词什么是可变/不可变对象不可变对象,该对象所指向的内存中的值不能被改变。当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址。可变对象,该对象所指向的内存中的值可以被改变。变量(准确的说是引用)改变后,实际上是其所指的值直接发生改变,并没有发生复制行为,也没有开辟新的出地址,通俗点说就是原地改变。Python中,数值类型...

weixin_42151305的博客 1973

python中可变对象、不可变对象的引用、复制及对象的+=和+

文章目录1.对象和对象的引用2.可变对象和不可变对象3.两种对象在内存中的存储3.两种对象更改数值时的内存4.两种对象的赋值和复制不可变对象可变对象5.两种对象的+=和=+6.两种对象的函数传参 今天在看一个递归的时候列表赋值又把我绕晕了,这个点每次看每次忘,所以来总结一下 1.对象和对象的引用 对象:指在内存中存储的数据,每个对象包含一个头部信息,有类型表示符和引用计数器 对象的引用:是一个变...

虎哥的铲屎员 694

【Python】python中可变对象和不可变对象

一、定义: 可变对象:当有需要改变对象内部的值的时候,这个对象的id不发生变化。 不可变对象:当有需要改变对象内部的值的时候,这个对象的id会发生变化。 二、可变对象 可变对象包括:字典(dict), 集合(set), 列表(list)。 此可变对象会与浅拷贝和深拷贝有很大的联系, 看上一篇博客。 以列表为例子如下图所示, 对 a_list 的修改就不会改变a_list的id: 二、不可变对象 不可变对象包含 整型(int), 字符串(string), 浮点型(float), 元组(tuple

学无止境、积少成多、厚积薄发 339
上一篇: SumatraPDF开启多窗口
下一篇: 去除Win10文件资源管理器窗口左侧的OneDrive图标
Estrellas_
博客等级 码龄9年 273粉丝 233原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值