Python中函数参数的传递是采用传值方式,但是和C/C++有所不同

C/C++方式

void fun(int a)
{
a = 10;
} void main()
{
int c =3;
fun(c);
}

上面示例,c最终的值是3.因为c是将3这个值传递给了fun,其本身的值没有变。fun函数在使用3这个值时,又申请了一个临时的存储空间,这个存储空间在调用函数结束后被销毁。

void fun(int *a)
{
*a = 10
} void main()
{
int c =3;
fun(&c);
}

上面的示例,c最终的值是10.函数还是采用传值的方式,但是以为定义的是指针变量,所以fun函数认为传递的值是一个地址。修改指针变量指向的存储空间地址的内容,也就是修改c的内容。

Python的方式

变量 VS 类型

python的变量是没有类型的,所有的变量可以理解成是内存中一个对象的“引用”,用c来表示就是 void *。所以并不像c语言里面有某某类型变量的说法。比如

int a =1;

上面可以表述为 a 是一个int型变量

a  = 1

上面不能像c那样理解。a只是一个“指针”,这个“指针”指向一个int型的对象

可更改(mutable)与不可更改(immutable)对象

在Python中,strings,numbers,tuples是不可更改对象,list,dict是可更改对象。对比c语言理解

int a = 1;
a =2;
a = 1
a = 2

两种方式a最终的结果都是2.但是处理方式是不一样的。在c语言中,是给a申请了一个存储空间,并给这个存储空间赋值为1,随后改成2.在python中,是在内存中建立一个值为1的对象,并使a“指向”它,随后赋值为2的时候,并不是修改这个值为1的对象,而是将其抛弃。重新申请一个值为2的对象,并使a“指向”它。这是因为numbers对象是不可更改的

a = [1]
a[0]=2

同理,这里构建了一个list对象,并使a指向它,但是因为list对象是可以改变的。所以list的第0个元素的值发生了改变。用c链表表述的话,就是原来指向int型变量值为1的指针重新定向到了指向int型变量的值为2的指针。

typedef list int *;
int a[3] ={1};
list = a;
*(list) = 2;

可以看到list并没有

赋值与引用

a = 4
b = a
b = 5

上面脚本的输出结果为:

a = 4 b =5

a = [3,4]
b = a
b[0] = 10

上面的脚本输出结果

a = [10 ,4] b =[10 , 4]

可以看出,number是赋值,而列表是引用。

Python函数传值

所以结果很明显了,当传递immutabble对象时,被传递对象无法被改变,当传递mutable时,被传递对象可以被改变。

def fun(a):
a = 10 b = 2
fun(b)

当b传递给fun时,a和b都指向2这个不可更改的对象。当fun函数给a赋值,因为对象不可更改,所以只能新建一个对象,并将a重新指向它,而b的值并没有改变。

def fun(a):
a[0] = 10 b = [2]
fun(b)

同上,但是list对象是可以被改变的,a和b同时指向了这个list对象,所以在fun函数中发生的修改,使b指向的list的值发生了改变。

Python函数参数传递的更多相关文章

  1. Python 函数参数传递机制.

    learning python,5e中讲到.Python的函数参数传递机制是对象引用. Arguments are passed by assignment (object reference). I ...

  2. Python 函数 参数传递

    参数传递    在 python 中,类型属于对象,变量是没有类型的:        a=[1,2,3]        a="Runoob"    以上代码中,[1,2,3] 是 ...

  3. [蟒蛇菜谱]Python函数参数传递最佳实践

    将函数作为参数传递,同时将该函数需要的参数一起传递.可参考threading.Timer的处理方式: class threading.Timer(interval, function, args=[] ...

  4. python函数的参数传递问题---传值还是传引用?

    摘要:在python中,strings, tuples, 和numbers是不可更改的对象,而list,dict等则是可以修改的对象.不可更改对象的传递属于传值,可更改对象属于传引用.想要在函数中传递 ...

  5. Python 函数的参数传递

    C/C++中,传递参数的类型是可以指定的.一般来说,传递参数可以分为两种:值传递和引用传递.对于值传递,参数传递的过程中进行了复制操作,也就是说,在函数中对参数的任何改动都不会影响到传入的变量:对于引 ...

  6. Python 函数中,参数是传值,还是传引用?

    在 C/C++ 中,传值和传引用是函数参数传递的两种方式,在Python中参数是如何传递的?回答这个问题前,不如先来看两段代码. 代码段1: def foo(arg): arg = 2 print(a ...

  7. python函数和lambda表达式学习笔记

    1. python函数 不同于其他语言,python支持函数返回多个值 为函数提供说明文档:help(函数名)或者函数名.__doc__ def str_max(str1, str2): ''' 比较 ...

  8. Python语言特性之1:函数参数传递

    问题:在Python文档中好像没有明确指出一个函数参数传递的是值传递还是引用传递.如下面的代码中"原始值"是不放生变化的: class PassByReference: def _ ...

  9. Python学习笔记之函数参数传递 传值还是传引用

      在学完Python函数那一章节时,很自然的的就会想到Python中函数传参时传值呢?还是传引用?或者都不是? 在回答上面的问题之前我们先来看看下面的代码: 代码1: def foo(var): v ...

随机推荐

  1. Eclipse的PyDev插件安装及解决安装后找不到的问题

    一.环境 windows 7 64bit eclipse 4.5.2 pydev jdk7u55 二.安装步骤 1. 安装JDK eclipse依赖于Java环境,所以需要安装Java运行环境JRE. ...

  2. (11) openssl req(生成请求证书、私钥和自建CA)

    伪命令req大致有3个功能:生成证书请求文件.验证证书请求文件和创建根CA. 由于openssl req命令选项较多,所以先各举几个例子,再集中给出openssl req的选项说明.若已熟悉opens ...

  3. vue 框架原理

    参考:https://segmentfault.com/a/1190000006599500#articleHeader4 记录自己的理解: 核心的响应原理通过Object.definePropert ...

  4. Python-接口自动化(十一)

    配置文件的作用(十一) (十二)配置文件 1.python当中有一个模块可以读取配置文件里面的信息:configparser,对这个模块进行导入之后就可以使用了,import configparser ...

  5. 解决Can’t finish GitHub sharing process Successfully created project ‘GitHubDemo’ on GitHub

    Can't finish GitHub sharing process        Successfully created project 'KeyWordsFrameWork' on GitHu ...

  6. Leetcode 274.H指数

    H指数 给定一位研究者论文被引用次数的数组(被引用次数是非负整数).编写一个方法,计算出研究者的 h 指数. h 指数的定义: "一位有 h 指数的学者,代表他(她)的 N 篇论文中至多有 ...

  7. bzoj3637 CodeChef SPOJ - QTREE6 Query on a tree VI 题解

    题意: 一棵n个节点的树,节点有黑白两种颜色,初始均为白色.两种操作:1.更改一个节点的颜色;2.询问一个节点所处的颜色相同的联通块的大小. 思路: 1.每个节点记录仅考虑其子树时,假设其为黑色时所处 ...

  8. CSU1030素数槽

    Description 处于相邻的两个素数p和p + n之间的n - 1个连续的合数所组成的序列我们将其称为长度为n的素数槽.例如,‹24, 25, 26, 27, 28›是处于素数23和素数29之间 ...

  9. middle(bzoj 2653)

    Description 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整. 给你一个长度为n的序列s. 回答Q个这样的询问:s的左端点在[a,b ...

  10. 【HDOJ6335】Nothing is Impossible(贪心)

    题意: 有n道题目m个人,每道题目有1个正确选项和a[i]个错误选项,每个人每道题只能选一个选项 求出最坏情况下分数最多的人至少能拿到几分 n<=1e2,m<=1e9,1<=b[i] ...