python3默认参数陷阱】的更多相关文章

默认参数的值是容器类型,每次调用函数的时候,如果不传值,会用公用资源池 def func(k, v=[]): v.append(k) print(v) func('wt') func('ab', []) func('cd') # 占用wt的内存 def extend_list(v, li = []): li.append(v) return li list1 = extend_list(10) list2 = extend_list(20, []) print(list2) list3 = ex…
[转]Python函数默认参数陷阱 阅读目录 可变对象与不可变对象 函数默认参数陷阱 默认参数原理 避免 修饰器方法 扩展 参考 请看如下一段程序: def extend_list(v, li=[]): li.append(v) return li list1 = extend_list(10) list2 = extend_list(123, []) list3 = extend_list('a') print(list1) print(list2) print(list3) print(li…
请看如下一段程序: def extend_list(v, li=[]): li.append(v) return li list1 = extend_list(10) list2 = extend_list(123, []) list3 = extend_list('a') print(list1) print(list2) print(list3) print(list1 is list3) 请先猜想打印的结果: 是不是这样: [10] [123] [a] False 但是,实际的打印效果 请…
其实也不能说是陷阱,只是一个不容易注意到的地方,尤其是有其他java/c++类编程语言经验的人员,这里涉及到python的一个特点,所以笔者说是陷阱只是一个噱头而已. def test(item, buf = []): buf.append(buf) print buf 非常简单的一个函数,功能非常简单,现在看下面的调用代码 test('younger') test('shen') 输出: ['younger'] ['younger', 'shen'] 该函数初衷是希望当没有提供默认的buff参…
对于学习python的人都有这样的困惑 def foo(a=[]): a.append(5) return a Python新手希望这个函数总是返回一个只包含一个元素的列表:[5].结果却非常不同,而且非常惊人(对于新手来说): >>> foo() [5] >>> foo() [5, 5] >>> foo() [5, 5, 5] >>> foo() [5, 5, 5, 5] >>> foo() 实际上,这不是设计缺陷…
对于学习python的人都有这样的困惑 def foo(a=[]): a.append(5) return a Python新手希望这个函数总是返回一个只包含一个元素的列表:[5].结果却非常不同,而且非常惊人(对于新手来说): >>> foo() [5] >>> foo() [5, 5] >>> foo() [5, 5, 5] >>> foo() [5, 5, 5, 5] >>> foo() 实际上,这不是设计缺陷…
默认参数的坑 定义一个函数,传入一个list,添加一个end再返回 1 2 3 def  add_end(L=[]):     L.append('END')     return L 正常调用时,结果似乎不错 1 print  add_end([1,2,3])  #[1, 2, 3, 'END'] 使用默认参数调用时,一开始结果也是对的,但是再次调用时,结果就不对了 1 2 3 4 5 print add_end()   #['END']   print add_end()    #['END…
在Python中,作为默认参数的一定要是不可变对象,如果是可变对象,就会出现问题,稍不注意,就会调入陷阱,尤其是初学者,比如我(┬_┬). 我们来看一个例子. def add(L=[]): L.append(1) return L L = [1, 2, 3] newL = add(L) print(newL) newL = add(newL) print(newL) testL = add() print(testL) testL = add() print(testL) testL = add…
一:内置函数 globals() locals() 1.返回的是字典,字典里面的键值对:全局作用域的全部内容 print(globals()) 2.返回的是字典,字典里面的键值对:当前作用域的全部内容 print(locals()) 二:默认参数的陷阱 1.默认参数:没传值,可变数据类型在内存中是同一个 def func(name, alist=[]): alist.append(name) renturn alist r1 = fun('whj') print(r1) >>>['whj…
python 版本 3.5 #Author by Andy#_*_ coding:utf-8 _*_def func(x,y=2): print('我是形参%s'%x) print('我是默认参y--->%s'%y)func(1)#1是实参,x为形参,y为默认参数#若实参数目不固定def func1(*args): print(args)func1([1,2.3,4,5])#([1, 2.3, 4, 5],)func1(*[1,2,3,4,5])#(1, 2, 3, 4, 5)#实参为字典 **…
默认参数实际上只有一个值 代码1 def func(l = 1): l += 1 print(l) func() func() func() 代码2 lst = [] def func(a,l = lst): l.append(a) print(l)func(1) # [1] func(2,[]) # [2] func(3) # [1,3]变量是变量,值是值 变量的名字和有多少个值没有对应关系 我们在看修改的时候:要看修改的是哪一个对应的值而不是变量 def func(l = []): # 在函…
def extend_list(v, li=[]): li.append(v) return li list1 = extend_list(10) print(list1) # [10] list2 = extend_list(123, []) print(list2) # [123] list3 = extend_list('a') print(list3) # [10, 'a'] print("-" * 20) print(list1) # [10, 'a'] print(list…
函数文档 1.什么是函数文档: 就是放在函数体之前的一段说明,其本身是一段字符串,一个完整的函数需要带有函数文档,这样利于他人阅读,方便理解此函数的作用,能做什么运算 2.怎么查看函数文档: function.__doc__ 注意:不加小括号 3.例: 你可能会想,假如我不传入参数能直接打印函数文档吗? 测试一下就知道: 结果是可以的 接着想,前面说不能带小括号,我确认一下是不是真的不能带小括号呢: 果然是不行的,接着看: 有没有什么发现?总结一下: 函数的.__doc__属性里,因为函数加括号…
1.数学意义的函数与python中的函数 数学意义的函数 y = 2*3+1 x =3 y =7 x是自变量,y是因变量 2.python中定义函数的方法 一个函数往往都是为了完成一个特定的功能而存在的,所以注释信息加上是个好习惯 def atest(x): "The function definitions" x += 1 return x def:     定义函数的关键字 atest:     函数名 ():     内可定义形参 "":    文档描述(非必…
Python进阶-函数默认参数 写在前面 如非特别说明,下文均基于Python3 一.默认参数 python为了简化函数的调用,提供了默认参数机制: def pow(x, n = 2): r = 1 while n > 0: r *= x n -= 1 return r 这样在调用pow函数时,就可以省略最后一个参数不写: print(pow(5)) # output: 25 在定义有默认参数的函数时,需要注意以下: 必选参数必须在前面,默认参数在后: 设置何种参数为默认参数?一般来说,将参数值…
add by zhj: Python设计者为何将默认参数设计成这样呢?参见Python函数参数默认值的陷阱和原理深究 原文:https://github.com/acmerfight/insight_python/blob/master/Default_Parameter.md 文章的主题 不要使用可变对象作为函数的默认参数例如 list,dict,因为def是一个可执行语句,只有def执行的时候才会计算默认默认参数的值,所以使用默认参数会造成函数执行的时候一直在使用同一个对象,引起bug. 基…
python函数: 默认参数: retries= 这种形式 def ask_ok(prompt, retries=, complaint='Yes or no, please!'): while True: ok = raw_input(prompt) if ok in ('y', 'ye', 'yes'): return True if ok in ('n', 'no', 'nop', 'nope'): return False retries = retries - : raise IOEr…
在Python教程里,针对默认参数,给了一个“重要警告”的例子: def f(a, L=[]): L.append(a) return L print(f(1)) print(f(2)) print(f(3)) 默认值只会执行一次,也没说原因.会打印出结果: [1] [1, 2] [1, 2, 3] 因为学的第一门语言是Ruby,所以感觉有些奇怪. 但肯定的是方法f一定储存了变量L. 准备知识:指针 p指向不可变对象,比如数字.则相当于p指针指向了不同的内存地址. p指向的是可变对象,比如lis…
一.参数陷阱 在使用默认参数时,可能碰见下列情况 def show_args_trap(i, li = []): li.append(100) li[i] = 101 print(li) show_args_trap(0) show_args_trap(1) show_args_trap(2) # 显示结果为: # [101] # [101, 101] # [101, 101, 101] 分析: 大家知道:含有默认参数的,不输入该参数就使用默认的值:在这里,第一次调用函数的时候,只传入一个参数0…
1. 构建有默认参数的函数 当我们在构建一个函数或者方法时,如果想使函数中的一个或者多个参数使可选的,并且有一个默认值,那么可以在函数定义中给参数指定一个默认值,并且放到参数列表的最后就行了.比如: def func(a, b=42): print(a, b) func(1) #a=1, b=42 func(1,2) #a=1, b=2 如果默认参数使一个可以修改的容器,比如一个列表,集合或者字典,可以使用None作为默认值.比如: #使用列表list作为默认值 def func(a, b=No…
python 函数参数定义有四类: 1.必选参数:调用函数时候必须赋值的参数. a,须以正确的顺序传入函数b,调用时的数量必须和声明时的一样 def exa(x): return x #b作为参数进入函数体内 b=1 print exa() #错误 TypeError: exa() takes exactly 1 argument (0 given) 2,默认参数:初始已经有值,在调用时未更改使用默认值 def exa(x=1) return x 3,可变参数:不确定参数个数,会分配给带“*”参…
https://eastlakeside.gitbooks.io/interpy-zh/content/Mutation/ 看下面的代码 def add_to(num, target=[]): target.append(num) return target add_to(1) # Output: [1] add_to(2) # Output: [1, 2] add_to(3) # Output: [1, 2, 3] 这次又没有达到预期,是列表的可变性在作怪.在Python中当函数被定义时,默认…
 =================默认参数==================在函数声明时表明默认值,在函数定义时正常定义void function(int a = 2)// 函数声明void function(int a)//函数定义{    //code.... }具体规则1.默认参数在声明中给出或者在定义中给出(默认参数可以放在函数声明或者定义中,但只能放在二者之一) 2.形参的参数名可以省略 例如 void function(int =2) 3.默认声明后不得再次尝试声明来试图更改默认…
语言更新时每一个新增的特性都是从千百万开发者需求里提取过来的,规范采用后能减少程序员的痛苦,带来便捷. 我们经常会这么写 function calc(x, y) { x = x || 0; y = y || 0; // to do with x, y // return x/y } 简单说就是x,y提供了一个默认值为0,不传时x, y以值0来运算.传了就以实际值计算. 又如定义一个ajax function ajax(url, async, dataType) { async = async !…
1.函数默认参数 1 int func(int a,int b=10) 2 { 3 return a*b; 4 } 5 6 int main() 7 { 8 int c=func(2); 9 cout<<c<<endl; 10 } 2. volatile  可以保证对特殊地址的稳定访问,不会出错 参考: 1)c语言中volatile关键字是什么含义 2)详解C中volatile关键字 3.…
C++/java/python系列的语言,函数可以有默认值,通常类似如下的形式: funtion_name (param1, param2=default_value, ...) 到了matlab下发现并不能这样写.那是不是说matlab中希望函数有默认参数,就一定要很麻烦地,使用nargin来辅助实现呢?比如: % 第三个参数有默认值 function [result]=some_fun(param1, param2) if (nargin<3) param3 = 'default_param…
Delphi的参数可以分为:默认参数(传值).var(传址).out(输出).const(常数)四类 可以对比C/C++的相关知识,类比学习. 1.默认参数是传值,不会被改变,例子 function MyFun(x : Integer) : Integer; begin Inc(x); Result := x; end; 2.var参数是传址,会被改变,例子 function MyFunVar(var x : Integer) : Integer; begin Inc(x); Result :=…
默认参数 一般情况下,函数调用时实参个数应与形参相同,但为了更方便地使用函数,C++也允许定义具有默认参数的函数,这种函数调用时实参个数可以与形参不相同.“默认参数”指在定义或声明函数时为形参指定默认值(default).这样的函数在调用时,对于默认参数,可以给出实参值,也可以不给出实参值.如果给出实参,将实参传递给形参进行调用,如果不给出实参,则按默认值进行调用. #include<iostream> using namespace std; ){ //延时函数,默认延时1000个时间单位…
修改内容: 1.系统默认管理员员帐号密码 2.系统默认LAN 接口地址 3.系统默认DHCP及保留地址 4.系统默认云AC远程地址及协议内容 5.系统默认JS插入地址 6.系统默认探针位置 7.默认顶部LOGO.底部copyright内容 8.WIFIDOG各项默认参数 9.自动将MAC地址填入WiFiDog网关ID,可以不用输入网关ID等 …… …… 联系方式:QQ561454825,电话:13779953060…
原创博客:转载请标明出处:http://www.cnblogs.com/zxouxuewei/ 1.默认参数的目的 C++可以给函数定义默认参数值.通常,调用函数时,要为函数的每个参数给定对应的实参.例如: void delay(int loops): //函数声明 void delay(int loops) //函数定义 { ) return: ;i<loops,i++): } 无论何时调用delay()函数,都必须给loops传一个值以确定时间.但有时需要用相同的实参反复调用delay()函…