默认参数的陷阱

默认参数的陷阱 : 默认参数实际上只有一个值    如果是可变数据类型,无论这个函数被调用多少次,    共用这个默认参数a = []b = []a.append(1)print(a,b)

a = []b = aa.append(1)print(a,b)

变量是变量,值是值变量的名字和有多少个值 没有对应关系我们在看修改的时候 : 要看修改的是哪一个具体的值而不是变量

l = []      # 在定义函数之前定义了一个[]def func():    l.append(1)func()func()func()func()

def func(l = []): # 在函数定义的时候 创建了一个[]                  # 对于默认参数来说,[]只定义一次    l.append(1)

func()func([])   # 又创建了一个新的空列表,传给func,代替l=[]这个默认参数func()func()

def func2(a = 0):  # 在函数定义的时候,创建了一个值 0,只有一个0,a永远不消失    a += 1         # a = 0 + 1 = 1  局部变量 会随着这个函数的调用而消失    print(a)

func2()func2()func2()func2()

l = []l.append(1)算法 : 超过4个值 把这个列表扩大一倍

函数 是 第一类对象的概念函数名 可以赋值\可以做参数\做返回值\容器类型中的一项(可以作为字典的key)函数的内存地址() ==> 调用这个函数函数的函数名会改变么 ??? 不会改变

闭包 : 缓存和装饰器内部函数引用了外部函数的变量,内部函数就是一个闭包def outer():    a = 1    # 先来计算/执行代码 获得要缓存的值    def inner():        ‘‘‘引用一个外部函数的变量a‘‘‘        ‘‘‘引用外部缓存的值‘‘‘    return inner # inner 函数的内存地址

inn = outer()inn()inn()

缓存 把一个值存储在内存里如果一个值 在网络上存,那么你想拿到这个值需要联网 下载 (消耗时间)如果一个值 要通过复杂的计算才能得出结果,那么每一次你想拿到这个值都要重新计算一次(消耗时间)

装饰器 本质就是一个闭包一个函数写完之后就不能修改了,这个时候想在这个函数之前或者之后添加一些功能 就用装饰器

原文地址:https://www.cnblogs.com/F18866/p/9958020.html

时间: 2024-10-28 20:30:28

默认参数的陷阱的相关文章

默认参数的陷阱自我心得

默认参数的陷阱 : 默认参数实际上只有一个值 代码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 =

Python(55)_默认参数的陷阱

#-*-coding:utf-8-*- ''' 函数复习 ''' def f(): return 'bowen' print(2+3) # 事实上python中会调用内部的函数,相当于add() print(f()) def wahaha(*args): print(args) wahaha(1,2,3) l = [1,2,3] wahaha(*l) ''' 默认参数的陷阱 如果默认参数的值是一个可变数据类型,那么每一次调用的时候,不传值就公用这个数据类型的资源 简单的说,就是不传值的情况下,始

Python中list作为默认参数的陷阱

在Python中,作为默认参数的一定要是不可变对象,如果是可变对象,就会出现问题,稍不注意,就会调入陷阱,尤其是初学者,比如我(┬_┬). 我们来看一个例子. 1 def add(L=[]): 2 L.append(1) 3 return L 4 5 L = [1, 2, 3] 6 newL = add(L) 7 print(newL) 8 newL = add(newL) 9 print(newL) 10 11 testL = add() 12 print(testL) 13 testL =

易错点 默认参数陷阱

默认参数陷阱 可变的数据类型 (列表)------用于实际开发中不可变数据类型(字符串,数字,元组 ====易错点如下==== def func(l=[]): l.append(123) print(l) func() func([]) func() # [123] # [123] # [123, 123]

Python函数参数默认值的陷阱和原理深究(转)

add by zhj: 在Python文档中清楚的说明了默认参数是怎么工作的,如下 "Default parameter values are evaluated when the function definition is executed. This means that the expression is evaluated once, when the function is defined, and that the same “pre-computed” value is used

python函数默认参数陷阱

对于学习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默认参数陷阱

对于学习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 当list,dic作为默认参数的坑爹之处

先看代码: def foo(a, b =[]): b.append(a) print b foo(1) foo(2) 结果想象中是: >>> [1] [2] >>> 实际上是: >>> [1] [1, 2] >>> 查看官方文档:https://docs.python.org/2.7/tutorial/controlflow.html#default-argument-values The default values are eva

Python函数的默认参数的设计【原创】

在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