先上图。

图里,分别用三个整数进行了验证。可以发现当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. 关于.NET中的控制反转(三)- 依赖注入之 Autofac

    一.Autofac简介 Autofac和其他容器的不同之处是它和C#语言的结合非常紧密,在使用过程中对你的应用的侵入性几乎为零,更容易与第三方的组件集成.Autofac的主要特性如下: 组件侵入性为零 ...

  2. 记一次Goroutine与wg导致的问题

    前言 今天发现了一个问题是之前一直没有注意到的,这里记一下 正文 Send Closed Chan 问题概述 代码逻辑是启动时启动多个 channel, channel1 获取数据监听数据处理后发送给 ...

  3. 屏蔽每分钟SSH尝试登录超过10次的IP

    屏蔽每分钟SSH尝试登录超过10次的IP 方法1:通过lastb获取登录状态: #!/bin/bash DATE=$(date +"%a %b %e %H:%M") #星期月天时分 ...

  4. 用SAP浏览网页

    在SAP里,通过两个类就可以做一个简单的,嵌入sap里的网页.这两个类就是 1. cl_gui_custom_container 这个类是自定义屏幕里用得,也就是画一个container,在这个容器中 ...

  5. SAP 中session和外部断点设置的区别

    1 Session Breakpoints:只在当前user session的所有main session中有效 2 External Breakpoints 在abap editor或事务SICF中 ...

  6. CF76A Gift

    题目描述 有一个国家有N个城市和M条道路,这些道路可能连接相同的城市,也有可能两个城市之间有多条道路. 有一天,有一伙强盗占领了这个国家的所有的道路.他们要求国王献给他们礼物,进而根据礼物的多少而放弃 ...

  7. Python安装教程之anaconda篇

    [导读]我们知道,Python的功能非常强大.那么对于迫切想学习Python的新手同学来说,第一件事情可能需要了解python是什么?能用来做什么?语法结构是怎样的?这些我们几句话很难介绍清楚,后续会 ...

  8. Http中的options请求

    引自:https://www.jianshu.com/p/5cf82f092201.https://www.cnblogs.com/mamimi/p/10602722.html 一.options是什 ...

  9. 转 6 jmeter元件的作用域与执行顺序

    6 jmeter元件的作用域与执行顺序   元件的作用域 配置元件(config elements)会影响其作用范围内的所有元件.前置处理程序(Per-processors)在其作用范围内的每一个sa ...

  10. feign使用okHttpClient,调用原理

    最近项目中 spring cloud 用到http请求,使用feign,配置okhttp,打算配置一下就直接使用,不过在压测与调优过程中遇到一些没有预测到的问题,附上排查与解析结 yml.pom配置 ...