先上图。

图里,分别用三个整数进行了验证。可以发现当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中变量值改变地址也会跟着改变的更多相关文章

  1. c# 把对象加入队列,对象为全局变量,对象改变队列值也跟着改变

    若程序把对象加入队列,对象为全局变量,对象改变队列值也跟着改变,如下: filecontent  为两个字段的属性值. class FileContent { // public string Htt ...

  2. python 交换变量值

    在其他语言中,交换两个变量值的时候,可以这样写: temp = a a = b b = temp 在Python中,我们可以简单的这样写: a,b=b,a 实验如下: >>> a=1 ...

  3. 浅谈python中字典append 到list 后值的改变问题

    看一个例子 ? 1 2 3 4 d={'test':1} d_test=d d_test['test']=2 print d 如果你在命令行实践的话,会发现你改动的是d_test ,但是d 也跟着改变 ...

  4. python中传值和传地址问题

    在python中,还没有对这个知识点有一个详细的定义,很模糊的说明了,通过下面代码,可以观察出来,什么时候传的是值,什么时候传的是地址 有时候会发现自己的数据发生变化,可能就是这个原因,python的 ...

  5. python 交换变量值为何不需要中间变量

    python 元组解包unpacking,同一语句中多重赋值 cpython 认为几种变量的交换是比较常见的,提供了专门的优化指令,像[-5,256]预先放到了整数池中一样,

  6. python traceback 变量值

    import sys import traceback import cgitb def handleException(excType, excValue, trace): print 'error ...

  7. XCODE调试时不显示变量值/指针地址的解决方案

    转:http://blog.csdn.net/samuelltk/article/details/41250151

  8. java获取配置文件中变量值

    在resources 目录下新建config.properties文件 #文件保存路径 filePath=E:\\images\\file 工具类 public class ConfigUtil { ...

  9. JS数组存储(两个数组相等,一个改变,另一个跟着改变)

    数组是一种引用数据类型,数组引用变量只是一个引用,数组元素和数组变量在内存里是分开存放的实际的数组元素被存储在堆(heap)内存中:数组引用变量是一个引用类型的变量,被存储在栈(stack)内存中. ...

随机推荐

  1. 技术面试没过,居然是没有用pytest测试框架

    1.引言 我有一个朋友是做Python自动化测试的.前几天他告诉我去参加一个大厂面试被刷了. 我问他是有没有总结被刷下来的原因.他说面试官问了一些 pytest 单元测试框架相关的知识,包括什么插件系 ...

  2. for _ in range( ):

    for _ in range( ): { //函数体 } 其中"-"只是一个占位符,可以把它理解为i或者j等等任意的字母. 上面代码相当于同下: for i in range( ) ...

  3. Sentry(v20.12.1) K8S 云原生架构探索,玩转前/后端监控与事件日志大数据分析,高性能+高可用+可扩展+可伸缩集群部署

    Sentry 算是目前开源界集错误监控,日志打点上报,事件数据实时分析最好用的软件了,没有之一.将它部署到 Kubernetes,再搭配它本身自带的利用 Clickhouse (大数据实时分析引擎)构 ...

  4. 【函数分享】每日PHP函数分享(2021-1-7)

    ltrim() 删除字符串开头的空白字符(或其他字符). string ltrim ( string $str[, string $character_mask]) 参数描述str 输入的字符串. c ...

  5. 万万没想到,面试中,连 ClassLoader类加载器 也能问出这么多问题…..

    1.类加载过程 类加载时机 「加载」 将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在内存上创建一个java.lang.Class对象用来封装类在方法区内的数据 ...

  6. Java实现RS485串口通信

    前言 前段时间赶项目的过程中,遇到一个调用RS485串口通信的需求,赶完项目因为楼主处理私事,没来得及完成文章的更新,现在终于可以整理一下当时的demo,记录下来. 首先说一下大概需求:这个项目是机器 ...

  7. Java并发包源码学习系列:ReentrantReadWriteLock读写锁解析

    目录 ReadWriteLock读写锁概述 读写锁案例 ReentrantReadWriteLock架构总览 Sync重要字段及内部类表示 写锁的获取 void lock() boolean writ ...

  8. redis存json数据时选择string还是hash

    redis存json数据时选择string还是hash 我们在缓存json数据到redis时经常会面临是选择string类型还是选择hash类型去存储.接下来我从占用空间和IO两方面来分析这两种类型的 ...

  9. windows下使用mingw和msvc静态编译Qt5.15.xx

    windows下使用mingw和msvc静态编译Qt5.15.xx 下载并安装相关依赖软件 Python version 2.7 https://www.python.org/downloads/ ( ...

  10. drop table 命令不回收以前的相关访问权限

    drop table 命令不回收以前的相关访问权限,也就是说假如我现在把表删除了,然后再创建一个同名的表时,会自动赋予权限的.