Mutable and Immutable Variables in Python
本文解决python中比较令人困惑的一个小问题:传递到函数中的参数若在函数中进行了重新赋值,对于函数外的原变量有何影响。看一个小栗子:
def fun(a):
a=2
return
a=1
fun(a)
请问程序执行后,a=1还是2?并解释原因。
实际上,这个问题有两个比较tricky的地方:
1. python的变量是没有类型的,类型属于对象。也就是说当我们操作x=6的时候,6是一个int类型的对象,而x就是个名字,其指针指向6这个对象。除此之外,x可以指向任何类型的对象,哪怕先后指向不同类型的对象也不会出错。

2. python中的对象分为mutable和immutable两种,二者在作为参数传递时有根本的区别。各个类型的对象分类见下表:

首先,代码中a=1的意思是,创建变量a(指针a),指向数字1这个对象的地址。在调用fun(a)的时候,因为数字对象是immutable的,所以传递到fun函数中的参数,实际上并不是a,而是a的复制品,暂且说成是b。b也是指向1这个对象的,所以说,之后在函数内部无论再怎么修改这个参数,和之前的变量a已经没有关系了。所以程序的执行结果是1。
3. Accessor and Mutator
在面向对象语言中,一个对象中有可能存在两种方法:Accessor method以及Mutator.
例如:

str的upper()方法就是一个Accessor Method,因为它并不会改变x的值。再看一个Mutator的例子:

调用reverse()方法后,myList中的顺序被改变了,说明reverse()是一个Mutator方法。所有的对象都有Accessor方法,但并不是都有Mutator方法。具有Mutator方法的对象是Mutable的,仅有Accessor的对象是Immutable的。
Mutable and Immutable Variables in Python的更多相关文章
- [Python] Understand Mutable vs. Immutable objects in Python
In this lesson, you will learn what mutable and immutable objects are, and the difference between th ...
- MUTABLE和IMMUTABLE集合
Scala 集合类系统地区分了可变的和不可变的集合.可变集合可以在适当的地方被更新或扩展.这意味着你可以修改,添加,移除一个集合的元素.而不可变集合类,相比之下,永远不会改变.不过,你仍然可以模拟添加 ...
- Java中的mutable和immutable对象实例讲解
1.mutable(可变)和immutable(不可变)类型的区别 可变类型的对象:提供了可以改变其内部数据值的操作,其内部的值可以被重新更改. 不可变数据类型:其内部的操作不会改变内部的值,一旦试图 ...
- Swap 2 Variables in Python
In Python, it's concise, easy and faster to swap 2 variables compared in other Programming languages ...
- correct ways to define variables in python
http://stackoverflow.com/questions/9056957/correct-way-to-define-class-variables-in-python later say ...
- mutable and immutable
employees = ['Corey', 'John', 'Rick', 'Steve', 'Carl', 'Adam'] output = '<ul>\n' for employee ...
- 2.3 Python语言基础
2.3 Python语言基础 1 语言语义(Language Semantics) 缩进,而不是括号 Python使用空格(tabs or spaces)来组织代码结构,而不是像R,C++,Java那 ...
- 《流畅的Python》Object References, Mutability, and Recycling--第8章
Object References, Mutability, and Recycling 本章章节: Variables Are Not Boxes identity , Equality , Al ...
- 读书笔记, Python - python-tricks-buffet-awesome-features
To be a Pythonista 1. assert syntax: assert expression1 [",", expression2] 大致相当于 if __debu ...
随机推荐
- Codeforce 1175 D. Array Splitting
新鲜热乎的题 Codeforce 1175 D. 题意:给出一个长度为$n$的序列$a$,你需要把它划分为$k$段,每一个元素都需要刚好在其中一段中.分好之后,要计算$\sum_{i=1}^{n} ( ...
- flex布局解说和属性
1. flex-direction 规定当前DIV下面的子元素是横向布局还是纵向布局 row 默认值,横向布局相当于float:left column 纵向,相当于DIV默认的垂直方向 2.justi ...
- python:while循环语句及练习题
while循环语句及练习题 Python 编程中 while 语句用于循环执行程序,即在某条件下,循环执行某段程序,以处理需要重复处理的相同任务.其基本形式为: while 判断条件: 执行语句... ...
- python-批量解压zip、rar文件
这是一个用python写解压大量zip脚本的说明,本人新手一个,希望能对各位有所启发. GitHub:https://github.com/lgf133214/Windows-python3- 首先要 ...
- Codeforces 1012B Chemical table (思维+二分图)
<题目链接> 题目大意:给定一个n*m的矩阵网格,向其中加点,对于一个组成矩形的四个点中如果有三个点中有元素,那么第四个点中会自动产生新的元素.问你最少再加多少个点能够填满这个网格.解题分 ...
- Redis设计与实现 -- 动态字符串对象(SDS)
1. 动态字符串( simple dynamic string, SDS) 在 Redis 中,当需要可以被重复修改的字符串时,会使用 SDS 类型 ,而不是 C 语言中默认的 C 字符串类型 .举个 ...
- XC6SLX45T-2FGG484C 原厂订购 原装正品
作为一家科研公司,保证的原厂品质和正规采购渠道是科学严谨的研发工作中重要的一环,更是保证研发产品可靠.稳定的基础.而研发中所遇到的各种不可预测的情况更是每个工程师向技术的山峰攀登中时会遇到的各种难题. ...
- IBM IMM默认ID
默认ID: http://192.168.70.125用户名:USERID密码:PASSW0RD (数字0)
- [IOI1998]Polygon(区间dp)
[IOI1998]Polygon 题意翻译 多边形是一个玩家在一个有n个顶点的多边形上的游戏,如图所示,其中n=4.每个顶点用整数标记,每个边用符号+(加)或符号*(乘积)标记. 第一步,删除其中一条 ...
- Kotlin搞起来——2.基础知识
在上一节中简单的给大家介绍了下Kotlin的特点,以及结合自己实际项目 中的使用来帮助大家了解这门语言,其实真的没你想象中的那么难,本文打算 介绍的是Kotlin中基础相关的一些语法(用法),有个大概 ...