python哪些是可变对象_python的不可变对象与可变对象及其妙用与坑
先上图。
图里,分别用三个整数进行了验证。可以发现当a和b值相同时,a与b地址也一致。改变a的值,a的地址也跟着改变了。
原因
python的宗旨之一,万物皆对象。(单身狗狂喜)
而对象又被分为可变对象和不可变对象。比如int,str,float,tuple都是不可变对象。所谓不可变,就是说,从实现上而言,这些对象的内容是不能更改的。虽然我们一直都可以用a=4这样来赋值,但其实是创建了一个新的,值为4的int对象。而原本被我们赋值为3的那个a,依然存在并被赋值为3,但缺失引用之后会被python的内存机制进行垃圾回收。(引用计数为0,python的内存回收机制那一套内容)
而可变对象则是类似list,dict这样可以改变内容的类型。它们的内容被更改时其本身地址不会改变。但注意,存储于其中的内容又是不可变对象,所以其内容的地址有可能改变。
这是紧接着上面那张图的部分,原本e列表后两个数为3和4时,它们共用了b和a的地址。而后修改e[2]的值后,其地址也发生了改变。但e本身的地址从未改变过。
妙用和坑
最直接的用法当然就是用于传参了。
比如定义一个类,这个类的__init__方法需要外部的变量来初始化成员变量。
如果之后实例化之后,希望在修改对象成员变量的同时也修改外部变量,那么就将外部变量以列表等可变对象的形式封装。比如原本需要outer_d=0传入为inter_d并修改同步outer_d的值,就把outer_d定义为[0],然后在内部修改inter_d[0]就能同步修改了。
而坑的也正是这里,如果你的类或者函数,使用了array,list等作为参数,那么就要时刻小心!是否会因为类内部方法而无意中更改了外部的变量导致bug。而如果你实在需要这样做,我的建议是,在类内部初始化时,用一些非直接赋值的方法进行初始化!比如,重新声明一个self.lista=[],然后用循环把外部列表的每一个元素挨个地给append到self.lista里面去。因为列表内为不可变对象,所以这样做后你怎么修改self.lista都不会无意触碰到外部变量了!
python哪些是可变对象_python的不可变对象与可变对象及其妙用与坑相关推荐
- python中如何创建类的对象_python面向对象中如何建立具体的对象?
我们现在眼前所能看到的事物,都是具体的对象.很多小伙伴在面向对象中创建对象,其实都停留在对象名称的建立,计算机中并没有具体对象的描述属性.我们想要使用python中的类,建立的对象就需要是具体的.下面 ...
- python canvas画移动物体_Python GUI编程入门(25)-移动Canvas对象
Canvas对象生成之后,有时会希望调整对象的位置.例如前面文章中提到的时钟小程序,我们稍加改造可以另外实现一个指针式时钟: 在这个小程序中增加的功能就是根据具体时间计算每个指针的坐标信息,这部分功能 ...
- python为什么要实例化对象_python:类的定义、实例化对象
定义:类的定义使用关键字 ,class 关键字: 封装:类可以把各种对象组织在一起,作为类的属性,通过 . (点)运算符来调用类中封装好的对象 属性:变量在类中称为属性,但是类中的属性不仅仅只包含变量 ...
- python基本模块中的对象_Python 学习笔记 -- OS模块的常用对象方法
1 #这里列举在os模块中关于文件/目录常用的函数使用方法 2 3 #这里需要注意下,在使用这些方法前记得导入os模块 4 import os #导入os模块 5 """ ...
- python组合和继承的区别_Python开发之面向对象、类和对象、组合与继承的实例讲解...
一.面向对象 如何创建一个类 class Xxxx: dic={xxx:xxx,xx:xx,x:x} #属性 def __init__(self,xxx,xxx,xxx): # 定义属性 def ac ...
- python创建类的两个对象_Python为一个类创建多个对象
分步教程 要读取文件内容,请使用io.open.如果任何名称有强调字符,请不要忘记指定文件编码.在with io.open('students.txt', mode="r", en ...
- python将整数逆序_python练手入门小项目:字符串的妙用
题目来源:小行:python练手入门小项目详解(一) 1 给任意一个的正整数,要求:一.求它是几位数,二.逆序打印出各位数字. 代码: def reversed_integer(number):ass ...
- python中、变量指向的对象可以发生变化吗_python中的引用传递,可变对象,不可变对象,list注意点...
python中的引用传递 首先必须理解的是,python中一切的传递都是引用(地址),无论是赋值还是函数调用,不存在值传递. 可变对象和不可变对象 python变量保存的是对象的引用,这个引用指向堆内 ...
- python中不可变对象_Python中的可变对象与不可变对象、浅拷贝与深拷贝
Python中的对象分为可变与不可变,有必要了解一下,这会影响到python对象的赋值与拷贝.而拷贝也有深浅之别. 不可变对象 简单说就是某个对象存放在内存中,这块内存中的值是不能改变的,变量指向这块 ...
最新文章
- 开平方的 7 种算法
- 避免不必要的Spring配置组件扫描
- python代码大全和用法用量_Python生成器的使用方法和示例代码
- HTML中  等6种空白空格的区别
- 使用Mybatis-Generator自动生成entity实体、dao接口以及mapper映射文件
- SMOTE(Synthetic Minority Over-Sampling Technique ,即“人工少数类过采样法“)----Python调包简单实现
- echarts中国地图
- 银行代收代付代扣业务
- STL(标准模板库)
- mindmanager2021下载 最新版如何更新
- 重磅,12306抢票小助手开源了!
- 使用iptables进行流量控制
- 学ui和python哪个好找工作_学it好不好找工作?过来人告诉你
- iOS 绘制股票K线图
- shell 脚本批量检测主机存活状态
- 尚学堂怎么样?告诉你学渣是怎样成为前端工程师的
- [WIP] Keystone Federation (by quqi99)
- 虚幻引擎在游戏之外可以做什么呢?
- 【Java基础知识】 异常处理机制
- matlab利用函数 编程求,MATLAB 函数编写方法与应用
热门文章
- Hololens2-OpenXR开发(二)-实现通讯
- 如何在本地安装tomcat、jdk并且配置tomcat环境变量(window7)
- Blender程序性纹理学习教程大师班 Creative Shrimp – Procedural Texturing Blender Master Class
- git用户文档1 — git基础
- 函数返回类的对象与拷贝构造函数
- str.format() 格式化字符串函数
- CSS中各种各样居中方法的总结
- 第17章 使用iSCSI服务部署网络存储
- iOS开发—block介绍
- uboot readme 文件 (1)