Python中函数参数是引用传递(注意不是值传递)。对于不可变类型,因变
量不能修改,所以运算不会影响到变量自身;而对于可变类型来说,函数体
中的运算有可能会更改传入的参数变量。

引用传参一:

>>> a = 100 #这里的a是不可变类型
>>> def test(a):
... a+=a
#这个式子有两层含义:1.这里可能是重新定义一个新的变量a,2.也有可能是修改a的值,但由于全局
#变量a不能修改,所以此处是重新定义了一个a;
... print("函数内:%d"%a)
...
>>> test(a)
函数内:200
>>> print(a)
100

引用传参二:

>>> a = [100] #这里的a是一个列表,是可变类型
>>> def test(a):
... a+=a #由于列表a是可变类型,所以这里是修改a
... print("函数内:")
... print(a)
...
>>> test(a)
函数内:
[100, 100]
>>> print(a)
[100, 100]

引用传参三:

>>> a = 100
>>> def test(a):
... a=a+a #最初为了好理解,所以可以认为a+=a等价于a=a+a,所以这里同引用传参一
... print("函数内:%d"%a)
...
>>> test(a)
函数内:200
>>> print(a)
100

引用传参四:

>>> a = [100]
>>> def test(a):
#1. 先算 =号右边的
#2. 算出来的结果是[100,100]
#3. a = [100,100]
#4. 让a变量指向了[100,100],即a保存的是[100,100]的引用(内存地址)
... a=a+a #对于这种情况,等号左边的a是重新定义的一个量,此时a=a+a与a+=a不一样
... print("函数内:")
... print(a)
...
>>> test(a)
函数内:
[100, 100]
>>> print(a)
[100]

事实上,我们可以通过打印相应变量的地址来帮助我们理解,例如:

a是int类型的情况:

a是列表的情况:

Python中的引用传参的更多相关文章

  1. python中给函数传参是传值还是传引用

    首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题.基本的参数传递机制有两种:值传递和引用传 ...

  2. 『Python × C++』函数传参机制学习以及对比

    一.Python函数传参 在python中,函数传参实际上传入的是变量的别名,由于python内在的变量机制(名称和变量值相互独立),只要传入的变量不可变(tuple中的元素也要是不可变的才行),那么 ...

  3. [ 随手记6 ] C/C++ 形参、实参、按值传参、指针传参、引用传参

    个人原创: 1. 形参:形式上的参数,一般多在函数声明.函数定义的参数上: 2. 实参:实体参数,有实际的值,在运算上被循环使用的值: 3. 按值传参:按值,就是把实际的值传给函数内部: 4. 指针传 ...

  4. Java中的new关键字和引用传参

    先看看Java中如何使用new关键字创建一个对象的. [java] view plain copy public class Student { public String name; public  ...

  5. # Python第十节 传参

    Python第十节 传参 一. 变量和变量名 首先说明变量名和变量的一点差异 例如: var = [1, 2, 3] `var = "Google" 调用变量var的时候, 既可以 ...

  6. python中的引用

    作为一个python初学者,今天被一个python列表和词典引用的问题折磨了很久,但其实了解了缘由也很简单,记录在此备忘. 首先背书python中的引用对象问题: 1. python不允许程序员选择采 ...

  7. Go 到底有没有引用传参(对比 C++ )

    Go 到底有没有引用传参(对比 C++ ) C++ 中三种参数传递方式 值传递: 最常见的一种传参方式,函数的形参是实参的拷贝,函数中改变形参不会影响到函数外部的形参.一般是函数内部修改参数而又不希望 ...

  8. python 线程创建和传参(28)

    在以前的文章中虽然我们没有介绍过线程这个概念,但是实际上前面所有代码都是线程,只不过是单线程,代码由上而下依次执行或者进入main函数执行,这样的单线程也称为主线程. 有了单线程的话,什么又是多线程? ...

  9. C++二级指针和指针引用传参

    前提 一级指针和引用 已经清晰一级指针和引用. 可参考:指针和引用与及指针常量和常量指针 或查阅其他资料. 一级指针和二级指针 个人觉得文字描述比较难读懂,直接看代码运行结果分析好些,如果想看文字分析 ...

随机推荐

  1. Ubuntu 16.04 总出现红色圆圈警告和检测到系统程序出现问题

    这种问题不可忽视!不可忽视!不可忽视!重要的事情说三遍!!!(一次死机,好多文件丢失,真是痛苦的经历) 自从从第三方安装了Python3.6,并将默认3.5改为3.6,导致ubuntu16.04右上角 ...

  2. Java代码操作HDFS

    package com.hy.hdfs; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.*; imp ...

  3. 创建一个MongoDB数据库再到配置成Window服务再设置用户名密码

    1.安装MongoDB数据在官网下载安装 然后在C盘找到C:\Program Files\MongoDB\Server\4.0\bin这个可执行目录 使用cmd进入到这: 2.在C盘根目录创建一个名为 ...

  4. 20175204 张湲祯 2018-2019-2《Java程序设计》第二周学习总结

    20175204 张湲祯 2018-2019-2<Java程序设计>第二周学习总结 教材学习内容总结 -第二章基本数据类型与数组要点: -标识符与关键字:标识符的第一个字符不能是数字字符: ...

  5. Java对象模型规约

      下面是我根据工作中项目的经验,总结的一套自己觉得比较方便的对象模型规约   model(实体模型)      -vo(与前端交互的对象模型,前端泛指页面.移动端和远程服务调用等)         ...

  6. springboot配置Druid数据源

    springboot配置druid数据源 Author:SimpleWu springboot整合篇 前言 对于数据访问层,无论是Sql还是NoSql,SpringBoot默认采用整合SpringDa ...

  7. php 文件系统函数及目录函数

    1.basename ,dirname ,pathinfo和realpath basename(path) 返回路径中的文件名部份,包含扩展名,path表示路径: dirname(path) 返回路径 ...

  8. java 读取本地文件并转换为byte数组

    private byte[] InputStream2ByteArray(String filePath) throws IOException { InputStream in = new File ...

  9. Java集合实现

    set: public class BSTSet<E extends Comparable<E>> implements Set<E> { private BST& ...

  10. 使用AltSearch格式化Kindle读书笔记

    AltSearch是LibreOffice Writer的一个用于自动化执行复杂文本替换操作的扩展,能够在不需要复杂编程的条件下进行一些文档格式的手动与批量转换和调整.该扩展除了支持普通文本与正则表达 ...