Python中list作为默认参数的陷阱】的更多相关文章

在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…
其实也不能说是陷阱,只是一个不容易注意到的地方,尤其是有其他java/c++类编程语言经验的人员,这里涉及到python的一个特点,所以笔者说是陷阱只是一个噱头而已. def test(item, buf = []): buf.append(buf) print buf 非常简单的一个函数,功能非常简单,现在看下面的调用代码 test('younger') test('shen') 输出: ['younger'] ['younger', 'shen'] 该函数初衷是希望当没有提供默认的buff参…
在我们平时写需求的时候,如果没有了解到以下知识点,可能会出现这样的问题,掉进坑里面,甚至很难找到问题的根源.下面我们来看看使用可变默认参数(Mutable default arguments)时会出现什么诡异的情况. 你可能写了以下函数,它有一个默认参数是一个list: def append_to(element, to=[]): to.append(element) return to 然后调用该函数: my_list = append_to(12) print(my_list) my_oth…
在python中函数参数中如果带有默认参数list遇到问题 先看一段代码 1 2 3 4 5 6 7 8 9 def f(x,l=[]):     for i in range(x):         l.append(i*i)     print(l)   print('---1---') f(4) print('---2---') f(5) 执行结果: 1 2 3 4 ---1--- [0, 1, 4, 9] ---2--- [0, 1, 4, 9, 0, 1, 4, 9, 16] 预期的结…
一:内置函数 globals() locals() 1.返回的是字典,字典里面的键值对:全局作用域的全部内容 print(globals()) 2.返回的是字典,字典里面的键值对:当前作用域的全部内容 print(locals()) 二:默认参数的陷阱 1.默认参数:没传值,可变数据类型在内存中是同一个 def func(name, alist=[]): alist.append(name) renturn alist r1 = fun('whj') print(r1) >>>['whj…
如果在调用一个函数时,没有传递默认参数,则函数内的默认参数是对函数的默认参数属性__defaults__的引用, 如 def func(arg1=[]): arg1.append(2) 调用func时如果没有传参,上面的arg1就是func.__defaults__[0]的引用 没传递默认参数,会发生以下情况 由于func.__defaults__[0]是可变类型,导致每一次调用func,arg1都会对func.__defaults__[0]进行操作(func.__defaults__[0].a…
在定义函数的时候,如果函数的参数有默认值,有两种类型的参数,一种是整数,字符串这种不可变类型,另一种是列表这种可变类型,对于第一种情况没有什么特殊的地方,但是对于可变类型,有一个微妙的小陷阱. 可变类型以及小陷阱: # coding=utf-8 def append_item(item, list1=[]): list1.append(item) return list1 print(append_item((1))) # [1] print(append_item((2))) # [1, 2]…
默认参数实际上只有一个值 代码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 = []): # 在函…
作者:達聞西链接:https://zhuanlan.zhihu.com/p/24162430来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 5.2.4 函数.生成器和类 还是从几个例子看起: def say_hello(): print('Hello!') def greetings(x='Good morning!'): print(x) say_hello() # Hello! greetings() # Good morning! greetings("Wh…
使用过Linux/Unix的人都会知道,命令行下的很多命令都需要参数,在C语言中添加和解析参数比较繁琐.Python中提供了optparse模块可以非常方便地处理命令行参数.   1  命令行参数的样子 我们一般在使用命令行程序的时候,可能会看到大约这样的样子(这是我写的一个简单命令行帮助列表): Usage: run.py [options] args Options: --version show program's version number and exit -h, --help sh…