本文解决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的更多相关文章

  1. [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 ...

  2. MUTABLE和IMMUTABLE集合

    Scala 集合类系统地区分了可变的和不可变的集合.可变集合可以在适当的地方被更新或扩展.这意味着你可以修改,添加,移除一个集合的元素.而不可变集合类,相比之下,永远不会改变.不过,你仍然可以模拟添加 ...

  3. Java中的mutable和immutable对象实例讲解

    1.mutable(可变)和immutable(不可变)类型的区别 可变类型的对象:提供了可以改变其内部数据值的操作,其内部的值可以被重新更改. 不可变数据类型:其内部的操作不会改变内部的值,一旦试图 ...

  4. Swap 2 Variables in Python

    In Python, it's concise, easy and faster to swap 2 variables compared in other Programming languages ...

  5. correct ways to define variables in python

    http://stackoverflow.com/questions/9056957/correct-way-to-define-class-variables-in-python later say ...

  6. mutable and immutable

    employees = ['Corey', 'John', 'Rick', 'Steve', 'Carl', 'Adam'] output = '<ul>\n' for employee ...

  7. 2.3 Python语言基础

    2.3 Python语言基础 1 语言语义(Language Semantics) 缩进,而不是括号 Python使用空格(tabs or spaces)来组织代码结构,而不是像R,C++,Java那 ...

  8. 《流畅的Python》Object References, Mutability, and Recycling--第8章

    Object References, Mutability, and Recycling 本章章节: Variables Are Not Boxes identity , Equality ,  Al ...

  9. 读书笔记, Python - python-tricks-buffet-awesome-features

    To be a Pythonista 1. assert syntax: assert expression1 [",", expression2] 大致相当于 if __debu ...

随机推荐

  1. 线程休眠只会用 Thread.sleep?来,教你新姿势!

    线程休眠是 Java 开发经常会用到的一个手段,就是让当前线程睡一会儿,睡醒之后再继续运行. 咱大多数程序员,多线程虽然学得不好,但线程休眠,无人不知,无人不晓,也都会用,不就是用 Thread.sl ...

  2. centos7中mysql不能输入中文问题的解决

    首先在数据库里面输入 mysql> show variables like'%char%' -> ; +--------------------------------------+--- ...

  3. PHP内置函数parse_str会自动进行urldecode(URL解码)

    用法:void parse_str ( string $str [, array &$arr] ) parse_str用来解析(分离)URL中的查询字符串(Query String),所谓查询 ...

  4. 98-基于FPGA Spartan6 的双路光纤PCIe采集卡(2路光纤卡) 光纤PCIe卡

    1.板卡概述 板卡采用xilinx Spartan6系列芯片,支持 PCI Express Base Specification 1.1 x1.内含丰富的逻辑资源和存储单元,板卡FPGA外接双片32M ...

  5. rabbitmq必须应答

    当autoAck设置为true时,只要消息被消费者处理,不管成功与否,服务器都会删除该消息, 而当autoAck设置为false时,只有消息被处理,且反馈结果后才会删除 https://www.cnb ...

  6. Oracle 数据库恢复命令

    前提是oracle服务能正常启动,但是客户端怎么都连接不上. 首先打开命令行,输入:sqlplus / as sysdba; 回车 连上数据库后,屏幕会显示:已连接到空闲例程. 接下来在SQL> ...

  7. 线程安全与非线程安全集合说一下,底层怎么实现的(hashmap,concurrenthashmap)

    Hashmap本质是数组加链表.根据key取得hash值,然后计算出数组下标,如果多个key对应到同一个下标,就用链表串起来,新插入的在前面. ConcurrentHashMap:在hashMap的基 ...

  8. 前端每日实战:47# 视频演示如何用纯 CSS 创作一个蝴蝶标本展示框

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/xzgZzQ 可交互视频教程 此视频 ...

  9. 一款易用、高可定制的vue翻页组件

    一款易用.高可定制的vue翻页组件 在线体验:pages.cixi518.com 使用 npm i vo-pages --save vo-pages组件父元素必须设置固定高度并填写属性overflow ...

  10. APP前置代码

    APP自动化前置代码: #导入包from appium import webdriverimport timedesired_caps = {}desired_caps['platformName'] ...