对Python中一些“坑”的总结及技巧
一.赋值即定义
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关键字解决以上报错
#!/usr/bin/env python
#_*_conding:utf-8_*_
x = 100
def outer():
def inner():
global x
#注意,我们先要在inner作用域中使用全局作用域的同名x变量就得优先使用"global"关键字进行声明。
x += 100
print(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。学习它就是为了深入理解变量作用域.
PS:遇到问题没人解答?需要Python学习资料?可以加点击下方链接自行获取
note.youdao.com/noteshare?id=2dce86d0c2588ae7c0a88bee34324d76
二.列表中的"+"与"+="的区别
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/yinzhengjie
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],)
2.列表防坑总结
列表的"+"和"+="的区别:
"+"表示两个列表合并并返回一个全新的列表。
"+="表示,就地修改前一个列表,在其后追加一个列表。就是extend方法。
3.注意引用变量的是可以被就地修改的(以函数的默认值参数为例)
#!/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中一些“坑”的总结及技巧的更多相关文章
- Python中Template使用的一个小技巧
Python中Template是string中的一个类,可以将字符串的格式固定下来,重复利用. from string import Template s = Template("there ...
- 整理了8个Python中既冷门又实用的技巧
1.print 打印带有颜色的信息 大家知道 Python 中的信息打印函数 print,一般我们会使用它打印一些东西,作为一个简单调试. 但是你知道么,这个 Print 打印出来的字体颜色是可以设置 ...
- python中的“坑”—持续更新
1.判断是否是回文 def is_back(s): ]==(s if s.strip() else False) print(is_back('上海自来水来自海上')) print(is_back(' ...
- python中单元测试/数据库预处理的技巧
假设文件结构: pkg/ __init__.py components/ core.py __init__.py tests/ core_test.py __init__.py python -m 你 ...
- Python中字典get方法的使用技巧
get方法,用于获取字典中某个键值key 对应value的值,此方法可以接收两个参数,第一个参数传入key的值,第二个参数用于传入一个自定义返回值,如果查询的key在字典中存在,就会反回对应key在字 ...
- Python中多维数组flatten的技巧
res00是一张rgb图 [x for sub1 in res00 for sub2 in sub1 for x in sub2] 列出所有像素值
- python中sqlite问题和坑
import sqlite3 #导入模块 conn = sqlite3.connect('example.db') C=conn.cursor() #创建表 C.execute('''CREATE T ...
- python中的这些坑,早看早避免。
python中的这些坑,早看早避免. 说一说python中遇到的坑,躲坑看这一篇就够了 传递参数时候不要使用列表 def foo(num,age=[]): age.append(num) print( ...
- python中round(四舍五入)的坑
python中的round函数不能直接拿来四舍五入,一种替代方式是使用Decimal.quantize()函数. 具体内容待补. >>> round(2.675, 2) 2.67 可 ...
随机推荐
- Codeforces Round #451 (Div. 2) A B C D E
Codeforces Round #451 (Div. 2) A Rounding 题目链接: http://codeforces.com/contest/898/problem/A 思路: 小于等于 ...
- 第二周选做(myod)
02.第二周myod(选做) 实验要求: 复习c文件处理内容 编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能 main与其他分开,制作静态库和动态库 编写Mak ...
- [UWP]使用CompositionGeometricClip裁剪复杂图形及进行动画
1. UWP中的其它裁剪方案 之前在 这篇文章 里,我介绍了如何使用UIElement.Clip裁剪UIElement的内容,使用代码如下: <Canvas> <Image Sour ...
- 解密国内BAT等大厂前端技术体系-阿里篇(长文建议收藏)
进入2019年,大前端技术生态似乎进入到了一个相对稳定的环境,React在2013年发布至今已经6年时间了,Vue 1.0在2015年发布,至今也有4年时间了. 整个业界在前端框架不断迭代中,也寻找到 ...
- 小白学 Python 爬虫(17):Requests 基础使用
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
- FPGA_VIP_V101 视频开发板 深入调试小结
FPGA_VIP_V101 推出已经有半年有余,各项功能例程已移植完毕,主要参考crazybingo例程进行移植和结合开发板设计了几个实例例程 主要包含: 硬件配置: FPGA:EP4CE6E22C8 ...
- 【JS】369- 20个常用的JavaScript字符串方法
点击上方"前端自习课"关注,学习起来~ 作者:前端小智 https://segmentfault.com/a/1190000020204425 本文主要介绍一些最常用的JS字符串函 ...
- 《吊打面试官》系列-ConcurrentHashMap & HashTable
你知道的越多,你不知道的越多 点赞再看,养成习惯 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试点思维导图,也整理了很多我的文档,欢迎Star和 ...
- python爬虫--代理.让你的ip在坚挺一会!!
代理 代理简述 代理服务器:实现请求转发,从而可以实现更换请求的ip地址 在requests中如何将请求的ip进行更换 代理的匿名度: 透明:服务器知道你使用了代理并且知道你的真实ip 匿名:服务器知 ...
- java中小数点位数
import java.math.BigDecimal;import java.text.DecimalFormat;import java.text.NumberFormat;import java ...