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
>>>

最新文章

  1. System.nanoTime()的使用
  2. 给NSString增加Java风格的方法
  3. Number of Islands
  4. Matlab中颜色线形和形状
  5. C#反射(一) 【转】
  6. dsplay:table页面合并表格
  7. 201521123068 《java程序设计》 第7周学习总结
  8. 高通8x12平台开机画面制作工具
  9. AI - TensorFlow - 过拟合(Overfitting)
  10. Mesos源码分析(14): DockerContainerier运行一个Task
  11. SSH 安全加固
  12. vue 修饰符
  13. [Git] 将本地分支与远程分支关联
  14. Docker Kubernetes 健康检查
  15. python实现的简单点对点(p2p)聊天
  16. Call requires permission which may be rejected by user: code should explicitly check to see if permi
  17. redie config 详解
  18. 第三百四十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫和反爬的对抗过程以及策略—scrapy架构源码分析图
  19. 【第八章】 springboot + mybatis + 多数据源
  20. BZOJ5289 HNOI/AHOI2018排列(贪心+堆)

热门文章

  1. 关于iOS Block当中为什么要用weakSelf和strongSelf的思考
  2. LR分析-demo2
  3. MySQL的库表详细操作
  4. vue 创建项目的命令
  5. JVM类加载机制概述
  6. 安装虚拟机与初触linux心得
  7. 20155220 2016-2017-2《Java程序设计》第五周学习总结
  8. 20155319 2016-2017-2《Java程序设计》课程总结
  9. 3-3 修改haproxy配置文件
  10. 【LG3241】[HNOI2015]开店