一.赋值即定义

1.运行以下代码会出现报错

#!/usr/bin/env python
#_*_conding:utf-8_*_
x = 100
def outer():def inner():x += 100    #其实这里等效于"x = x + 100",我们直到这是一个赋值语句,会优先计算右边的等式,即"x + 100".而在此时由于x变量赋值即定义,即此时的x和全局作用域的x并非同一个对象。print(x)return inner
foo = outer()
foo()

2.使用global关键字解决以上报错

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
#!/usr/bin/env python
#_*_conding:utf-8_*_
x = 100
def outer():def inner():global x        #注意,我们先要在inner作用域中使用全局作用域的同名x变量就得优先使用"global"关键字进行声明。x += 100print(x)return inner
foo = outer()
foo()#以上代码输出结果如下:
200

3.不推荐使用global

global总结

x+=1这种是特殊形式产生的错误的原因?先引用后赋值,而python动态语言是赋值才算定义,才能被引用。解决办法,在这条语句前增加x=0之类的赋值语句,或者使用global告诉内部作用域,去全局作用域查找变量定义
内部作用域使用x = 5之类的赋值语句会重新定义局部作用域使用的变量x,但是,一旦这个作用域中使用global声明x为全局的,那么x=5相当于在为全局作用域的变量x赋值

global使用原则

外部作用域变量会内部作用域可见,但也不要在这个内部的局部作用域中直接使用,因为函数的目的就是为了封装,尽量与外界隔离
如果函数需要使用外部全局变量,请使用函数的形参传参解决
一句话:不用global。学习它就是为了深入理解变量作用域.

二.列表中的"+“与”+="的区别

1.观察以下代码

#!/usr/bin/env python
#_*_conding:utf-8_*_def demo(x=[]):x += [1]                        #就地修改前一个列表,在其后追加后一个列表。就是extend方法。print(x)print(demo.__defaults__)            #我们可以查看默认参数列表demo()                                                      demo()print(demo.__defaults__)
#发现demo函数被调用2次后,默认参数的值也在跟随着变化!其原因是demo()执行完后弹栈会消亡,但解释器始终保留了一份"def demo(x=[])"的函数签名,这里面的x变量会随着解释器的消亡而消亡,除非我们使用"del"关键字去现实的删除该函数!如果我们这样干的话,后续就无法访问到该函数啦!#以上代码输出结果如下:
([],)
[1]
[1, 1]
([1, 1],)#!/usr/bin/env python
#_*_conding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjiedef demo(x=[]):x += [1]                        #就地修改前一个列表,在其后追加后一个列表。就是extend方法。print(x)print(demo.__defaults__)            #我们可以查看默认参数列表demo()                                                      demo()print(demo.__defaults__)            #发现demo函数被调用2次后,默认参数的值也在跟随着变化!其原因是demo()执行完后弹栈会消亡,但解释器始终保留了一份"def demo(x=[])"的函数签名,这里面的x变量会随着解释器的消亡而消亡,除非我们使用"del"关键字去现实的删除该函数!如果我们这样干的话,后续就无法访问到该函数啦!#以上代码输出结果如下:
([],)
[1]
[1, 1]
([1, 1],)

2.列表防坑总结

列表的"+“和”+="的区别:
"+"表示两个列表合并并返回一个全新的列表。
"+="表示,就地修改前一个列表,在其后追加一个列表。就是extend方法。

3.注意引用变量的是可以被就地修改的(以函数的默认值参数为例)

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
#!/usr/bin/env python
#_*_conding:utf-8_*_def demo2(x=1,y="abc",z={},*args,m=100,n,**kwargs):print(x,y,z)                            #打印位置参数print(m,n)                              #打印key-only关键词参数print(z.setdefault("abc","mn"))         #我们为"z"变量设置一组键值对print(demo2.__defaults__,demo2.__kwdefaults__)
#我们知道"__defaults__"保留的是位置参数相关信息,而"__kwdefaults__"保留的是关键字相关信息demo2(n=200)demo2(z = {},n = 200)print(demo2.__defaults__,demo2.__kwdefaults__)      #我们发现默认的"z"变量值是被咱们有意修改啦~#以上代码输出结果如下:
(1, 'abc', {}) {'m': 100}
1 abc {}
100 200
mn
1 abc {}
100 200
mn
(1, 'abc', {'abc': 'mn'}) {'m': 100}

Python语言防坑小技巧相关推荐

  1. 填坑总结:python内存泄漏排查小技巧

    摘要:最近服务遇到了内存泄漏问题,运维同学紧急呼叫解决,于是在解决问题之余也系统记录了下内存泄漏问题的常见解决思路. 本文分享自华为云社区<python内存泄漏排查小技巧>,作者:luti ...

  2. 菜鸟教程python3 mysql_python基础教程使用Python操作MySQL的小技巧

    1.获取插入数据的主键id import pymysql database = pymysql.connect( host="127.0.0.1", port=3306, user ...

  3. 10个Python进行数据分析的小技巧

    Pandas中数据框数据的Profiling过程 Profiling(分析器)是一个帮助我们理解数据的过程,而Pandas Profiling是一个Python包,它可以简单快速地对Pandas 的数 ...

  4. c语言io口置1,AVR C语言编程的小技巧-IO口置位

    avr AVR C语言编程的小技巧-IO口置位 给单片机IO口置位是编程用的比较多的操作,这是我在学习C语言编程中的一点小小心得,希望大家觉得有用! AVR 单片机的IO口是标准的双向端口,首先要设置 ...

  5. c语言io口置1,AVR_C语言编程的小技巧-IO口置位.doc

    AVR C语言编程的小技巧-IO口置位 给单片机IO口置位是编程用的比较多的操作,这是我在学习C语言编程中的一点小小心得,希望大家觉得有用!AVR 单片机的IO口是标准的双向端口,首先要设置IO口的状 ...

  6. 三周写出高性能的Python代码,这些小技巧你值得一试。

    1一个不上进的 Python 使用者 我是一个有 C 语言背景的开发者.最近转做了 Python,平时用 Python 还算 6,这周在给新员工分享工作之后,有个小孩跑来问我:"哥,你是学 ...

  7. 6行代码,带你学会Python最有用的小技巧【收藏不后悔】

    这篇博文主要介绍了Python有关的代码片段,通过简洁易懂的代码,给一些基础不是特别好的朋友提供便利,有利于学习,仅提供了几种小技巧的方法,希望对你们有帮助. 一.将 Python 3 和 pip 3 ...

  8. python少量数据分析代码_10个可以快速用Python进行数据分析的小技巧!

    一些小提示和小技巧可能是非常有用的,特别是在编程领域.有时候使用一点点黑客技术,既可以节省时间,还可能挽救"生命". 一个小小的快捷方式或附加组件有时真是天赐之物,并且可以成为真正 ...

  9. Python技术分享:Python学习的一些小技巧

    "人生苦短,我选Python".那么,你真的掌握了Python吗?下面小千为大家介绍初学Python的17个学习小技巧! 1.交换变量 有时候,当我们要交换两个变量的值时,一种常规 ...

最新文章

  1. 【深度学习】(7) 交叉验证、正则化,自定义网络案例:图片分类,附python完整代码
  2. 用命令行查看局域网的其他在线的ip
  3. Java中的显示锁 ReentrantLock 和 ReentrantReadWriteLock
  4. JMeter脚本获取变量名、检验字符串值
  5. python文件读取输出-Python 读写文件中数据
  6. libc glibc glib 的关系
  7. nssl1156-今天你AK了吗?【康托展开,高精度,二分答案,树状数组】
  8. Linux netfilter源码分析(4)
  9. 编程语言----00程序员常用网站
  10. C#中跨线程操作控件
  11. [转载] 学Python的笔记(在网上自学的总结)
  12. paip.jdbc 连接自动释放的测试
  13. python遍历文件夹内文件并检索文件中的中文内容
  14. 如何从12306网站下载自己喜欢的手机铃声
  15. 数字化施工管理太玄乎?“要点+案例”让你一看就懂
  16. R语言技巧:读取excel文件
  17. 工作一周随笔记———一个即将踏入编程的少年
  18. EF的Code First开发系列之动手写第一个Code First应用
  19. webp文件怎么打开?webp压缩工具推荐
  20. TTL怎么计算拉电流和灌电流_配电线路安全电流如何计算?低压供电线路导线怎么选择?图文详解...

热门文章

  1. centos6.5安装maven
  2. 页面性能的基础因素 - 《Designing for Performance》
  3. 原生态纯JavaScript 100大技巧大收集---你值得拥有
  4. jQuery 仿淘宝 鼠标悬停显示大图效果
  5. IaaS、PaaS和SaaS 公司都做些什么
  6. 《CLR Via C# 第3版》笔记之(十九) - 任务(Task)
  7. 德州职业技术学院计算机系,德州职业技术学院计算机系元旦晚会相声视频
  8. mapreduce编程规范_大数据之MapReduce详解
  9. 【学习笔记】月末操作-GR/IR重组
  10. 【ABAP】CK11N相关Table