本文解决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. vue 使用 computed 结合 filter 实现数据的的过滤和排序

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  2. 使用requests_html抓取数据

    from requests_html import HTMLSession import json class YejiCollege: def __init__(self, url): self.u ...

  3. jvm(1)性能监控-linux相关命令

    top命令能够实时显示系统中各个进程的资源占用情况,其输出信息分为两部分,前半部分为系统统计信息,后半部分是进程信息. 第一行是任务队列信息,它的结果等同于uptime命令. 第二行是进程统计信息: ...

  4. git stash 后"本地代码不见了"

    git stash 当本地代码不想提交覆盖,又忙于其他分支,可以先储存起来. git stash命令的作用就是将目前还不想提交的但是已经修改的内容进行保存至堆栈中,后续可以在某个分支上恢复出堆栈中的内 ...

  5. 68.Palindromic Substrings(回文字符串的个数)

    Level:   Medium 题目描述: Given a string, your task is to count how many palindromic substrings in this ...

  6. html中head示例

    <!DOCTYPE html> <!-- #统一的规范--> <!--类似html这种 ,html标签<html>dasdasd</html>&g ...

  7. JavaScript—— 案例:表单验证

    QQ号:<input type="text" id="txtQQ"><span></span><br> 邮箱:& ...

  8. linux性能分析工具Cpu

  9. linux典型应用对系统资源使用的特点

  10. 阿里云搭建香港代理服务器 shadownsocks

    阿里云香港代理服务器搭建方式: 1.阿里云官网购买轻量级服务器即可,流量,配置套餐自己选择,CENTOS7,进入控制台后打开端口管理列表,打开9000即可. 2.安装shadownsocks服务端: ...