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中变量值改变地址也会跟着改变的更多相关文章
- c# 把对象加入队列,对象为全局变量,对象改变队列值也跟着改变
若程序把对象加入队列,对象为全局变量,对象改变队列值也跟着改变,如下: filecontent 为两个字段的属性值. class FileContent { // public string Htt ...
- python 交换变量值
在其他语言中,交换两个变量值的时候,可以这样写: temp = a a = b b = temp 在Python中,我们可以简单的这样写: a,b=b,a 实验如下: >>> a=1 ...
- 浅谈python中字典append 到list 后值的改变问题
看一个例子 ? 1 2 3 4 d={'test':1} d_test=d d_test['test']=2 print d 如果你在命令行实践的话,会发现你改动的是d_test ,但是d 也跟着改变 ...
- python中传值和传地址问题
在python中,还没有对这个知识点有一个详细的定义,很模糊的说明了,通过下面代码,可以观察出来,什么时候传的是值,什么时候传的是地址 有时候会发现自己的数据发生变化,可能就是这个原因,python的 ...
- python 交换变量值为何不需要中间变量
python 元组解包unpacking,同一语句中多重赋值 cpython 认为几种变量的交换是比较常见的,提供了专门的优化指令,像[-5,256]预先放到了整数池中一样,
- python traceback 变量值
import sys import traceback import cgitb def handleException(excType, excValue, trace): print 'error ...
- XCODE调试时不显示变量值/指针地址的解决方案
转:http://blog.csdn.net/samuelltk/article/details/41250151
- java获取配置文件中变量值
在resources 目录下新建config.properties文件 #文件保存路径 filePath=E:\\images\\file 工具类 public class ConfigUtil { ...
- JS数组存储(两个数组相等,一个改变,另一个跟着改变)
数组是一种引用数据类型,数组引用变量只是一个引用,数组元素和数组变量在内存里是分开存放的实际的数组元素被存储在堆(heap)内存中:数组引用变量是一个引用类型的变量,被存储在栈(stack)内存中. ...
随机推荐
- Solon rpc 1.2.18 发布,突出Rpc特性
Solon 是一个微型的Java RPC开发框架.项目从2018年启动以来,参考过大量前人作品:历时两年,3500多次的commit:内核保持0.1m的身材,超高的跑分,良好的使用体验.支持:Rpc. ...
- mysql使用全文索引实现大字段的模糊查询
0.场景说明 centos7 mysql5.7 InnoDB引擎 0.1创建表 DROP TABLE IF EXISTS tbl_article_content; CREATE TABLE tbl_a ...
- 温故而知新--day1
温故而知新--day1 变量类型 变量是计算机存储数据的内存空间,由于计算机可以处理不同的数据,不同的数据就要定义不同的数据类型.python的数据类型很多,还可以自定义数据类型,常用的一般数据类型有 ...
- 洛谷P1055 字符串的处理-----ISBN
题目描述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括99位数字.11位识别码和33位分隔符,其规定格式如x-xxx-xxxxx-x,其中符号-就是分隔符(键盘上的减号),最后一位 ...
- netcore.ydal可能是东半球最好ORM框架
typora-copy-images-to: static ydal 项目框架介绍 可能是东半球最好netcore ORM框架,目前暂时支持mysql.mssql,其核心设计目标是开发迅速.学习简单. ...
- Lesson_strange_words3
can 电话耳机,(头戴式听筒) determine 决定 perform 执行 regular 常规的 duty 责任 compatible 兼容 preset 预置,预设 in either or ...
- 常见大中型网络WLAN基本业务实例
组网图形 大中型WLAN网络简介 本文介绍的WLAN网络是指利用频率为2.4GHz或5GHz的射频信号作为传输介质的无线局域网,相对于有线网络的铺设成本高,不便于网络调整和扩展.位置固定,移动性差等缺 ...
- Tomcat 配置Vue history模式
Tomcat 配置Vue history模式 近日 , 在使用 Tomcat 部署Vue项目时 , 刷新项目出现404的异常 . 原因是 Vue使用了history模式 , 而tomcat没有相关配 ...
- 【MyBatis】MyBatis 动态 SQL
MyBatis 动态SQL if 可以根据实体类的不同取值,使用不同的 SQL 语句来进行查询. 使用动态 SQL 最常见情景是根据条件包含 where 子句的一部分. 持久层 DAO 接口: pub ...
- LeetCode105 从前序和中序序列构造二叉树
题目描述: 根据一棵树的前序遍历与中序遍历构造二叉树. 注意:你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9 ...