python哪些是可变对象_python 中的可变对象与不可变对象
近日辞职待工,没有实际的项目与大家分享。暂写写在实际运用python中遇到的关于可变对象和不可变对象的坑。
首先我们需要明确一个概念,在python中一且皆对象。我们一般定义一个变量a=0,其实质a是一个类型变量,python 会把a封装为一个pyObject。我后面会用type方法来说明这个问题。
说在前面,在python 中变量名是一个类似标签的东西。它之前是什么类型与它之后是什么类型完全没有关系。我们可以把它理解为一个贴纸,可以随意从区块A撕下来贴到区块B上。正因为有这个特点,我们在使用python 对变量赋值时就无需担心变量类型问题。当然,为了规范和后面代码维护方便,此种做法需要节制,不然会让自己都搞不清最终需要的对象到底个什么类型,不方便调程序。
不可变对象
不可变对象一般包括int, float, bool, str, tuple. 不可变对象在函数调用过程中不会被更改,除非重新赋值。
这个例子中,a的类型为 int 说明它是一个类实例对象,根据python官方文档https://docs.python.org/3/library/functions.html#int,显示 class int ,进一步证实我们开篇提到的问题。 我们看到将变量a传入函数addTwoNum 中,将a+b的值赋给a并返回。从结果上看a的值并没有发生改变。我们在来看看各个变量的id。
这里我们看到,a 和 c 的id 不一样,说明它们是两个独立的存储区域。我们在看另一种写法。
这里我们看到,a 的id发生了变化,而且巧合的是现在的a 的id和 c 一样。说明此时a 的指向已经发生了改变。通过这个例子我们可以下这么个结论:不可变对象的存储区域相互独立。每次产生以个新的不可变对象则重新开辟一块区域。
可变对象
可变对象主要包括:list, dict, set。可变对象在参数传递过程会被改变。下面给出一个简单的例子:
我们看到,函数的返回类型什么也没有,但是li 列表的值确实发生了变化,我们还观察到一个很有意思的事,li 中元素的id 值都顺延了,不知道是不是由于li 中值时连续的整数的原因。为了证明li 的首部没有变,及li 本身指向的区块没有变,我们加入打印li 的id 的语句
从图上可以发现,li 的id 确实没有改变。从而可以说明li 没有变,但其值发生了变化。
运用
在知道了不可变对象和可变对象的特性后 ,我们可以根据它们各自的特点避免一些坑,特别是可变对象。在申明函数时,若函数参数存在可变变量,如果不需要每次都产生新的存储空间,我们可以不用另加判断,其中特别需要注意的函数中的局部变量一定不能与全局变量重名。如果需要每次都产生新的存储空间,那么最好是在函数内部声明一个变量,然后最后返回。例如,第一种情况,不需要每次都产生新的存储空间。
每执行一次函数,li 就增加两个元素。这种特性,用在递归中有很好的效果。给出一个括号匹配的算法,其中就运用到了可变变量这个能不断修改元素、添加元素的特性。
defgenerateParenthesis(N):
ans=[]def backtrack(S = '', left = 0, right =0):if len(S) == 2 *N:
ans.append(S)return
if left
backtrack(S+'(', left+1, right)if right
backtrack(S+')', left, right+1)
backtrack()return ans
第二种情况,每次都需要开辟新的存储空间:
虽然不可变变量与可变变量是一个简单的问题,我们也不能小看它呀,有时往往就是这种细小的错误让人抓狂。简单的一篇博文,有不足之处请及时指出,共同进步。
python哪些是可变对象_python 中的可变对象与不可变对象相关推荐
- python中函数的可变参数_Python中函数的参数定义和可变参数
转自:http://www.cnblogs.com/tqsummer/archive/2011/01/25/1944416.html 刚学用Python的时候,特别是看一些库的源码时,经常会看到fun ...
- python中不可变对象_Python中的可变对象与不可变对象、浅拷贝与深拷贝
Python中的对象分为可变与不可变,有必要了解一下,这会影响到python对象的赋值与拷贝.而拷贝也有深浅之别. 不可变对象 简单说就是某个对象存放在内存中,这块内存中的值是不能改变的,变量指向这块 ...
- python哪些是可变对象_Python中的可变对象和不可变对象
一.python中的变量与对象 首先在理解python的可变对象和不可变对象时,要理解python的赋值操作.在python中,一切事物皆是对象,变量是对象在内存中的存储和地址的抽象 对变量的理解 在 ...
- python中元组的值可变吗_python中对象的可变与不可变
在python中一切皆对象,对象是对数据的抽象. 所有对象有三个要素:类型.标识.值.类型决定对象可以支持哪些操作:标识指的是对象的内存地址,每个对象有唯一的地址,通过id内建函数可以求出地址:值从字 ...
- python中字典长度可变吗_python中列表长度可变吗
python中列表长度可变吗?下面给大家介绍一下python中可变和不可变的类型: 可变.不可变 可变/不可变类型,指的是:内存id不变,type也不变的前提下,value是否是可变的. int()和 ...
- python中的对象_Python中的变量、对象
由于没时间系统学习下Python 只能见一个问题探究一个问题了 一.初级 - 对象 关于Python中的数据类型,今天重新认识了下.[参考] 首先,Python中,对象才有类型, 变量是没有类型的,它 ...
- python列表长度可变吗_python中列表长度可变吗
python中列表长度可变,可变类型指的是内存id不变,type也不变的前提下,value是否是可变的.列表和字典都是可变类型,对于可变对象,比如list,对list进行操作,list内部的内容是会变 ...
- python比较两个数的和_Python中的is和==比较两个对象的两种方法
Python中的is和==比较两个对象的两种方法 在Python中有两种方式比较两个对象是否相等,分别是is和==,两者之间是不同的 ==比较的是值(如同java中的equals方法) is比较的是引 ...
- python一切皆对象_Python中一切皆为对象
众所周知,面向对象语言的特点即为"万物皆为对象",其中以Java开发尤为突出.那么在python中,这个 一切 是怎么表现出来的呢? 一切皆为对象(函数和类也是对象) 在Pytho ...
- python中什么叫类、什么叫对象_python中的类面向对象的基本概念!
一.概述 今天我们讲述Python中的类&面向对象的基本概念. 首先我们为什么要学习面向对象,我讲一个故事,应该就可以明白了.在古时候,官府衙门如果要颁布什么告示就会去找工匠将命令中的字都雕刻 ...
最新文章
- [C编码笔记] 空串与NULL是不一样的
- 青龙羊毛——鸡厂签到
- linux环境变量设置方法总结(PATH/LD_LIBRARY_PATH)
- 权限操作-springSecurity概述及快速入门步骤分析
- Linux版本Oracle工具,Linux下oracle可视化操作工具sqldeveloper安装与配置
- RichEdit 各个版本介绍
- 代码的抽象三原则【转载】
- [CLR via C#]18. Attribute
- 漫画:什么是桶排序?
- ALOS 12.5米精度DEM数据下载与处理
- [AHK]--显示器输入源快速切换
- 三星 android驱动安装失败,解决三星驱动SAMSUNG Mobile USB CDC Composite Device安装失败问题 - YangJunwei...
- CSAPP第八章家庭作业参考答案
- 国密算法概述 SM1、SM2、SM3、SM4、SM7、SM9、ZUC
- Pytorch——如何创建一个tensor与索引和切片(二)
- 计算机网络读书笔记(一)
- setsockopt与getsockopt的参数解析与使用
- AD5541+XTR111非标准测试
- php期末设计总结,PHP设计模式总结
- 台风来袭,推荐 韩国电影《熔炉》
热门文章
- DEX VMP与ARM VMP
- Android tinyplay与tinycap流程(十六)
- Android使adb作为host运行在arm64平台
- android mount --bind挂载目录
- Java如何连接Mysql数据库
- 阿里云轻量应用服务器/腾讯云轻量应用服务器如何安装宝塔面板?
- oracle 存储过程导出sql语句 导出为文件
- python散点图拟合曲线如何求拟合_python 拟合曲线并求参
- win10系统日志显示不可用sid_win10系统电脑修改sid安全标识符的操作方法
- php中array怎么用,php中array()函数如何使用