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)内存中. ...
随机推荐
- ES6 class类 静态方法及类的继承
一.class类 ES6之前都是定义函数以及函数的原型对象实现类型, 如果想要实现共享构造函数成员,可以用prototype来共享实现 ES6出现之后,使用class类的概念来实现原型的继承 二,静态 ...
- SonarQube学习(四)- 使用Jenkins集成JaCoCo和SonarQube检查代码测试覆盖率
一.前言 我始终觉得学习这件事是自己的事,自己会了就是会了,无关于他人,但有点小伤感的是现在的阅读量开始走低. 二.准备 安装Jenkins,请移步<Docker学习(二)- Docker 安装 ...
- 上班如何优雅的使用idea刷LeetCode(力扣)
打开idea file->setting ->plugins 搜索 "LeetCode" install "LeetCode editor" 重启后 ...
- idea启动build过慢
原文链接http://zhhll.icu/2020/04/17/idea/idea%E4%B9%8B%E7%BC%96%E8%AF%91%E9%97%AE%E9%A2%98/ 之前使用idea的时候每 ...
- M43 第一阶段考试
一.解答题 1.统计当前主机的TCP协议网络各种连接状态出现的次数 netstat -an | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a ...
- 初识JWT
1.JWT是什么 官方网站 JWT是JSON Web Token的简称.是一种开放标准(RFC 7519),定义了一种紧凑且自包含的方式,以JSON对象的形式在各方之间安全地传输信息,因为他被数字签名 ...
- 【Web】CSS实现抖音风格字体效果(设置文本阴影)
简单记录 -慕课网- 步骤一:抖音风格字体效果 案例:抖音风格的字体特效. 实现这个 需要设置 网页背景颜色 字体颜色 字体大小 文本阴影 重点介绍如何设置文本阴影 CSS的文本阴影text-shad ...
- Sentry(v20.12.1) K8S 云原生架构探索,1分钟上手 JavaScript 性能监控
系列 Sentry-Go SDK 中文实践指南 一起来刷 Sentry For Go 官方文档之 Enriching Events Snuba:Sentry 新的搜索基础设施(基于 ClickHous ...
- web dynpro配置注意事项
如果你想使用web dynpro 开发的应用,但是发现浏览器报错,那么你按照下面的步骤逐一进行检查吧.特别是返回的500错误,或者是你发现浏览器的地址栏中以http://<hostname> ...
- Java并发组件一之CountDownLatch
使用场景: 一个或N个线程,等待其它线程完成某项操作之后才能继续往下执行.CountDownLatch描述的是,一个或N个线程等待其他线程的关系. 使用方法: 设CountDownLatch个数:Co ...