Python是个人最喜欢的语言,刚开始接触Python时,总觉得有很多槽点,不太喜欢。后来,不知不觉中,就用的多了、习惯了、喜欢上了。Python的功能真的很强大,自己当初学习这门语言的时候,也记录过很多的笔记,现慢慢把这些笔记发布出来,希望对大家有所帮助,对自己也算是一个总结。

关于Python默认参数,假如默认参数是可变对象是会有副作用的,这一点我一开始不是很理解,直到有一天,看到一篇博文说:一个函数参数的默认值,仅仅在该函数定义的时候,被赋值一次。如此,只有当函数第一次被定义的时候,才讲参数的默认值初始化到它的默认值(如一个空的列表)。
听到这个解释,豁然开朗,解释器试验如下:

 >>> def f(x = []):
print(id(x))
x.append(1)
print x
print(id(x)) >>> f()
38869952 # 可变默认参数是在原地更改!!!
38869952
>>> f()
38869952 # 再次调用时,可变默认参数还是引用最初定义的!!!
38869952
# 注意,默认参数是在定义时赋值,且仅仅赋值一次。
# 当函数多次被调用,并且没有提供默认的参数值,就会从定义时赋值的地方取得值!
# 即使函数中给默认参数重新赋值了,下次调用还是会从定义赋值的地方取得值!
# 如以下的示例:当f2()多次调用,虽然在函数体里面给y重新赋值了,但是下次调用时
# 再次打印print id(x) 的结果也还是一样的!
# 所以:
# 1. 假如默认参数是可变对象,则会在原处直接更改对象,下次调用参数时,默认参数已经
# 更改过的了。如f()函数。
# 2. 假如默认参数不可变,那么给函数中给 参数赋值时,参数会引用内存的其他地方。下次函数调用时
# 默认参数还是从定义时赋值处取得值,因此没有副作用!
>>> def f2(y = None):
print(id(y))
if not y:
y = []
y.append(1)
print(id(y)) >>> f2()
505672708 # 定义时默认参数引用这一块内存。
38888872 # 函数体内赋值后,y引用其他地方。
>>> f2()
505672708 # 再次调用,y还是引用定义时赋值的内存处。
43910728 # 函数体内赋值后,y引用其他地方。
>>> f()
38869952
38869952
>>> f2()
505672708
43909408
>>> f2()
505672708
38868752
>>>

Python:默认参数的更多相关文章

  1. 笔记:Python 默认参数必须指向不变对象

    笔记:Python 默认参数必须指向不变对象 学习记录 >>> def add_end(L=[]): L.append('END') return L >>> ad ...

  2. python默认参数陷阱

    对于学习python的人都有这样的困惑 def foo(a=[]): a.append(5) return a Python新手希望这个函数总是返回一个只包含一个元素的列表:[5].结果却非常不同,而 ...

  3. Python默认参数的坑

    默认参数的坑 定义一个函数,传入一个list,添加一个end再返回 def add_end(L=[]): L.append('END') return L 正常调用时,结果似乎不错 print add ...

  4. Python 默认参数

    定义默认参数 定义函数的时候,还可以有默认参数. 例如Python自带的 int() 函数,其实就有两个参数,我们既可以传一个参数,又可以传两个参数: >>> int('123') ...

  5. python默认参数不能定义为可变对象类型

    python的默认参数只会在函数定义时被确定,而不是每次调用时重新确定,所以,一旦在函数中修改了默认参数,则在随后的调用中都会生效 由于这个特性,在定义函数时,如果默认参数使用可变的对象类型,如空列表 ...

  6. Python默认参数

    在python函数中, 可以使用如下方式声明并初始化参数 def to_smash(total_candies, n_friends=3): """Return the ...

  7. Python - 默认参数传参陷阱

    def extend_list(v, li=[]): li.append(v) return li list1 = extend_list(10) print(list1) # [10] list2 ...

  8. python默认参数问题

    我们在定义默认参数时,有时会遇到一写似乎难以理解的问题.比如,在第二次调用函数时,默认参数记住了上一次执行的结果: >>> def test(L=[3,]): ... L.appen ...

  9. Python默认参数的陷阱

    一:内置函数 globals() locals() 1.返回的是字典,字典里面的键值对:全局作用域的全部内容 print(globals()) 2.返回的是字典,字典里面的键值对:当前作用域的全部内容 ...

  10. Python 默认参数 关键词参数 位置参数

    def StudentInfo(country='中国', name): print('%s,%s' % (name, country)) StudentInfo('美国', '大卫') 上述代码报错 ...

随机推荐

  1. C#设计模式 —— 工厂模式

    . 工厂模式同样是项目中最常用的设计模式,工厂模式中又分为简单工厂,工厂方法,抽象工厂.下面我们由简单的开始逐一介绍. 1.简单工厂模式 简单工厂又被称为静态工厂,在设计模式中属于创建型模式.主要解决 ...

  2. Oracle数据库对表基本的操作--增删查改

    --向student表中加入入学时间属性,其数据类型为日期型alter table student add scome date; --删除student表中的入学时间属性alter table st ...

  3. TopJUI Combobox 联动

    这里给联动进行一个简单定义:因Combobox选择或输入的值发生改变时对自身或者其它组件产生影响称为联动.(注:editable确定是否可以手动输入) 有两种实现方法: 一.自己写对应的onChang ...

  4. 利用RTTI实现Delphi的多播事件代理研究

    我们知道Delphi的每个对象可以包含多个Property,Property中可以是方法,例如TButton.OnClick属性.Delphi提供的仅仅是 一对一的设置,无法直接让TButton.On ...

  5. BurpSuite—-Scanner模块(漏洞扫描)

    一.简介 Burp Scanner 是一个进行自动发现 web 应用程序的安全漏洞的工具.它是为渗透测试人员设计的,并且它和你现有的手动执行进行的 web 应用程序半自动渗透测试的技术方法很相似. 使 ...

  6. 蓝牙耳机电路和PCB(网上下载用于练习)

    这个是文件 https://pan.baidu.com/s/1smIyd_aNIt-ON8z8AeWn4Q 密码 w6ju 这是导入进去以后的样子,前面步骤我就跳过了 这是原作者的布局 但是我在看原理 ...

  7. pyasn1 安装异常

    初探Scrapy 时,也不知道按照哪里的文档装的,由于安装低版本的pyasn1 后,使用pip uninstall 都 卸不了 步骤如下: 异常: pyasn1-modules has require ...

  8. 20155301 2016-2017-2 《Java程序设计》第1周学习总结

    20155301 2016-2017-2 <Java程序设计>第1周学习总结 教材学习内容总结 Java SE的全称是Java Platform, Standard Edition,并用于 ...

  9. 20145226夏艺华 《Java程序设计》实验报告五

    实验五 Java网络编程及安全 实验内容 运行下载的TCP代码,结对进行 利用加解密代码包,编译运行代码,结对进行 集成代码,加密后通过TCP发送 结对伙伴:20145203 马超 实验步骤 (一)中 ...

  10. 【LG4491】[HAOI2018]染色

    [LG4491][HAOI2018]染色 题面 洛谷 题解 颜色的数量不超过\(lim=min(m,\frac nS)\) 考虑容斥,计算恰好出现\(S\)次的颜色至少\(i\)种的方案数\(f[i] ...