python参数传递】的更多相关文章

# 测试参数是传值还是传引用def test(arg): print("test before") print(id(arg)) arg[1]=30 # 测试可变对象 # arg[3][2] = 16 # 测试嵌套类型 # arg = list(range(5)) print("test after") print(id(arg)) return argchange_loc = 1if change_loc == 1: # 传入可变对象 my_list = list…
面试的时候,有没有被问到Python传参是传引用还是传值这种问题?有没有听到过Python传参既不是传值也不是传引用这种说法?一个小小的参数默认值也可能让代码出现难以查找的bug? 如果你也遇到过上面的问题,不妨我们来探究下Python函数传递的种种. 万物皆对象 Python中有一个非常重要的概念——万物皆对象,无论是一个数字.字符串,还是数组.字典,在Python中都会以一个对象的形式存在. a = 123 对于上面这行代码,在Python看来就是创建一个PyObject对象,值为123,然…
全局变量补充 python自己添加了些全局变量 print(vars()) """结果: {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00795650>, '__spec__': None, '__annotations__': {}, '__…
概念 真正的Python参数传递语法是*和**,其被称为 被称为打包和解包参数.*args和**kwargs只是大家默认的一种形式.也可以写成*keys和**kkeys等其他形式.二者都是为了在不知道函数可以接收的参数的数量时,定义函数可以接收任意数目的参数. 打包参数 所谓的打包参数,就是指 该参数用作函数的形参,等函数被调用被传入不固定数目的实参时,实参被打包被传入函数. *args 表示函数接收可变长度的非关键字参数列表作为函数的输入 exp: def func(a,*args): for…
python中的变量: 一个变量是局部还是全局,在编译函数的时候就已经决定,因此读变量值的时候也不会逐层向外查找.变量是全局还是局域,根据如下3条: 1. 如果函数内部有global语句,那么它声明的变量是全局的. 2. 如果函数内部有对变量的赋值语句,那么它是局域的. 3. 除此之外都是全局的. 注意1和2,和语句的位置无关,只要有这样的语句,那么它的范围就确定了.例如: def f(): print x if 0: x = 1 上面的程序中存在x=1,因此x为局域变量.(运行报错) x =…
个人推测结论: 可变对象传引用,不可变对象传值 python里的变量不同于c中地址储值模型 a=100 b=100 print(id(a),id(b),a==b,a is b) #8790877986944 8790877986944 True True 这两个变量id相同,值相等,如果 a=a+1,a的id也变了 浮点数也是这样 看成和str tuple一样的不可变对象,实际操作可以改变,但都是副本操作 暂且管它叫不可变对象的副本操作 def f(x): x+=100 return x a=1…
大家都知道在python中,一切皆对象,变量也不再具有类型,变量仅仅是对象的一个引用,我们通常用变量来测类型,通常测得就是被这个变量引用得对象的类型. python采用的是传递对象的引用,为了方便说明,我们来看一个例子: test = [1] def change1(a): a = [2] def change2(a): a.append(3) change1(test) change2(test) print test 我们来看一下最后的输出: [1,3] 是不是有人误以为是[2,3]?那你可…
1.形式参数:在定义函数时,函数名后面括号中的参数为“形式参数”,也称形参 2.实际参数:在调用一个函数时,函数名后面括号种的参数为“实际参数”,也就是将函数的调用者提供给函数的参数称为实际参数,也称实参 当实参为不可变对象时,进行的是值传递 当实参为可变对象时,进行的是引用传递 值传递和引用传递的基本区别就是: 1.进行值传递后,改变形参的值 2.实参的值不变,进行引用传递后,改变形参的值,实参的值也一同改变…
引用 先上个示例: >>> val = [1] >>> val[0] = val >>> val [[...]] 上述代码使val中包含自身,而产生了无限递归.上述示例表明Python中的变量名为引用类型,赋值只是使得左值指向与右值相同的内存对象. is运算符可以判断两个引用是否指向了同一个对象,而==运算符判断两个引用指向的值是否相等而不关心指向什么对象. 对引用不了解的朋友,可以把Python引用与C/C++中的void *类比,不过因为垃圾回收机…
首先需要说明python中元组,列表,字典的区别. 列表: 什么是列表呢?我觉得列表就是我们日常生活中经常见到的清单. 例如:lst = ['arwen',123] 向list中添加项有两种方法:append和extend. 两种方法的区别在于:extend()接受一个列表参数,把参数列表的元素添加到列表的尾部,append()接受一个对象参数,把对象添加到列表的尾部                                            [1,2].extend([1,2,3])…
我们在前面的章节里学习了Python的函数基础以及应用,那么现在想一想:传参,也就是把一些参数从一个函数传递到另一个函数,从而使其执行相应的任务,这个过程的底层是如何工作的,原理又是怎样的呢? 在实际过程中,我们写完了代码测试时候发现结果和预期值不一样,在一次次debug后发现是传参过程中数据结构发生了改变,导致程序出错.比富我们把一个列表作为实参传递给另一个函数,但是我们并不希望列表再函数运行结束后发生变化.但往往事与愿违,由于某些额外的操作改变了他的值,那就导致后续程序一系列错误的发生.因此…
[写在前面] 参考文章: https://www.cnblogs.com/spring-haru/p/9320493.html[偏理论,对值传递和引用传递作了总结] https://www.cnblogs.com/shizhengwen/p/6972183.html[用实例进行讲解演示] [正文部分] 值传递(passl-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间来存放由主调函数放进来的实参的值,从而想成为了实参的一个副本.值传递的特点是被调…
函数参数传递机制,传值和引用的是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题.基本的参数传递机制有两种:值传递和引用传递. 值传递(passl-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间来存放由主调函数放进来的实参的值,从而想成为了实参的一个副本.值传递的特点是被调函数对形势参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值. 引用传递(pass-by-refer…
Python函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.我们已经知道Python提供了许多内建函数,比如print().但我们也可以自己创建函数,这被叫做用户自定义函数. 定义一个函数 我们可以定义一个由自己想要功能的函数,以下是简单的规则: 函数代码块以def关键词开头,后接函数标识符名称和圆括号(). 任何传入参数和自变量必须放在圆括号中间.圆括号之间可以用于定义参数. 函数的第一行语句可以选择性地使用文档字符串-用于…
一.列表(list) 1.定义一个列表 name=["tom","jerry","12","13","lose","me"]  2.索引 与字符串的索引一样,列表索引从0开始. print ("第一个元素:%s"%name[0]) >>第一个元素:tomprint ("最后一个元素:%s"%name[-1])>>最后一个元素…
调用同事的函数,传入goods_list,获取商品信息,然后将商品信息与goods_list的信息进行匹配,合并. 但是同事返回数据的同时改变了我传入的参数,goods_list.相当于传参引用,也就是在内存中相同的地址进行更改数据, 将我传入的参数goods_list 进行覆盖.导致我的参数不能匹配. 特此记录: 先看一个例子 t_list = [1, 2]t_dict = {"a":"haha", "b":"hehe"}t…
作为一个python初学者,今天被一个python列表和词典引用的问题折磨了很久,但其实了解了缘由也很简单,记录在此备忘. 首先背书python中的引用对象问题: 1. python不允许程序员选择采用传值还是传引用.Python参数传递采用的肯定是“传对象引用”的方式.实际上,这种方式相当于传值和传引用的一种综合.如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值——相当于通过“传引用”来传递对象.如果函数收到的是一个不可变对象(比如数字.字符或者元组)的引用,就不能…
首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题.基本的参数传递机制有两种:值传递和引用传递. 值传递(passl-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本.值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值. 引用传递(pass-…
python中变量都被视为对象的引用.python函数调用传递参数的时候,不允许程序员选择传值还是传引用,python参数传递采用的都是“传对象引用”的方式.     这种方式相当于传值和传引用的结合,如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值——相当于通过“传引用”来传递对象:如果函数收到的是一个不可变对象(比如数字.字符串或元组)的引用,就不能直接修改原始对象——相当于“传值”来传递对象. def Func(x): x = 20 a = 10 Func(a)…
讨论copy与deepcopy的区别这个问题要先搞清楚python中的引用.python的内存管理. python中的一切事物皆为对象,并且规定参数的传递都是对象的引用.可能这样说听起来比较难懂,对比一下PHP中的赋值和引用就有大致的概念了.参考下面一段引用: 1. python不允许程序员选择采用传值还是传引用.Python参数传递采用的肯定是“传对象引用”的方式.实际上,这种方式相当于传值和传引用的一种综合.如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值——相当…
1.1,参数传递:*代表元组,**代表字典 1.2 ,常用数据类型 列表 [1,2,3] 元组 (1,2,3) 不可变的list 集合 {1,2,3} 字典 {1:a, 2:c} (4)字典以关键字为索引,关键字可以是任意不可变类型,通常是字符串或数值 1.3,文件读写的可选模式 read('r')只读 write('w')只写 'a':以追加方式打开文件,可写不可读 'r+':以可读可写方式打开文件 1.4,Zen of pythonpython交互解释器中输入import this即可看到.…
1.传值和传址 传值就是传入一个参数的值,传址就是传入一个参数的地址,也就是内存的地址(相当于指针).他们的区别是如果函数里面对传入的参数重新赋值,函数外的全局变量是否相应改变,用传值传入的参数是不会改变的,用传址传入就会. a=1 def f(b): b=2 f(a) print a 例如这段代码里面,首先声明a的值为1,把a作为参数传入到函数f里面,函数f里面对b重新赋值为2,如果是传值的形式传入a的话,a的值是不会变的,依然为1,如果以传址的形式传入a,a就会变成2.这个就是传值和传址的区…
摘要: 1 python中的一切事物皆为对象,并且规定参数的传递都是对象的引用. 2  python参数传递都是"传对象引用"方式.实际上相当于c++中传值和传引用的结合. 3 如果函数收到的是可变对象(比如字典或者列表)的引用,就能修改对象的原始值--相当于通过"传引用"来传递对象.不可变对象(比如数字.字符或者元组)的引用,就不能直接修改原始对象--相当于通过"传值"来传递对象. 4 copy模块的copy和deepcopy   目标在于复制…
函数的定义 Python 使用关键字def定义函数,格式与C语言类似,但是没有返回类型,参数也不需要设置类型. def add(a, b): """这是函数的文档字符串""" return a + b def append(data): data.append(a) #如果data为可变对象时候,例如List.Dict,则会改变实参的值 函数调用 会为函数局部变量生成一个新的符号表.确切的说,所有函数中的变量赋值都是将值存储在局部符号表.变量引用…
1.python常用的数据类型. int.float.str.set.list.dict.tuple.frozenset.bool.None. 2.docstring是什么? Docstring是一种文档字符串,用于解释构造的作用.我们在函数.类或方法中将它放在首位来描述其作用.我们用三个单引号或双引号来声明docstring. 要想获取一个函数的docstring,我们使用它的_doc_属性. 3.PYTHONPATH变量是什么? PYTHONPATH是Python中一个重要的环境变量,用于在…
在此之前先来看看变量和对象的关系:Python 中一切皆为对象,数字是对象,列表是对象,函数也是对象,任何东西都是对象.而变量是对象的一个引用(又称为名字或者标签),对象的操作都是通过引用来完成的.例如,a = []是一个空列表对象,变量 a 是该对象的一个引用 例1 def test(c): c.append("hello world") print(c,id(c)) return list = [1,2] test(list) print(list,id(list)) 输出 [1,…
1. Python没有 ++, --操作. 2. Join比+快:tuple比list快 3. Dict的key是区分大小写的 4. 参数顺序:无默认值参数,有默认值参数,tuple,dict 5. 通过对ditc的key的排序实现dict的排序 6.   不论是可以变的还是不可变的,在函数内赋值给参数是不会影响到调用者 7.   import Phone.Mobile.Analog Phone.Mobile.Analog.dial(“021-61750808”) 8.   from Phone…
精简版: 传值:被调函数局部变量改变不会影响主调函数局部变量 传址:被调函数局部变量改变会影响主调函数局部变量 Python参数传递方式:传递对象引用(传值和传址的混合方式),如果是数字,字符串,元组则传值:如果是列表,字典则传址: copy使用场景:列表或字典,且内部元素为数字,字符串或元组 deepcopy使用场景:列表或字典,且内部元素包含列表或字典 完整版: 1.传值和传址的区别 传值就是传入一个参数的值,传址就是传入一个参数的地址,也就是内存的地址(相当于指针).他们的区别是如果函数里…
传值:被调函数局部变量改变不会影响主调函数局部变量 传址:被调函数局部变量改变会影响主调函数局部变量 Python参数传递方式:传递对象引用(传值和传址的混合方式),如果是数字,字符串,元组则传值:如果是列表,字典则传址: 1. Python中的传址和传值 Python是不允许程序员选择采用传值还是传址的.Python参数传递采用传值和传址的一种综合. 如果函数收到的是一个可变对象(比如字典或者列表),就能修改对象的原始值(相当于传址).如果函数收到的是一个不可变对象(比如数字.字符或者元组)(…
Python参数传递采用的肯定是“传对象引用”的方式.这种方式相当于传值和传引用的一种综合.如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值--相当于通过“传引用”来传递对象.如果函数收到的是一个不可变对象(比如数字.字符或者元组)的引用,就不能直接修改原始对象--相当于通过“传值'来传递对象. 列表,字典等参数: 传引用,函数中对这些对象做修改,原来的值也会被修改. int,string, tuple: 传引用,但是结果像传值,函数的修改不会反映到原变量. #!/u…