对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 可 ...
随机推荐
- Spring Boot SpringApplication启动类(一)
目录 目录 前言 1.起源 2.SpringApplication 准备阶段 2.1.推断 Web 应用类型 2.2.加载应用上下文初始器 ApplicationContextInitializer ...
- Flink入门(二)——Flink架构介绍
1.基本组件栈 了解Spark的朋友会发现Flink的架构和Spark是非常类似的,在整个软件架构体系中,同样遵循着分层的架构设计理念,在降低系统耦合度的同时,也为上层用户构建Flink应用提供了丰富 ...
- 全面认识 RUST -- 掌控未来的雷电
文章目录 RUST 简介 如何衡量语言的好坏? 静态语言 编译器 语言定位 代表性项目 Hello World RUST 前景 RUST 简介 Rust 是一种兼顾内存安全.高并发和稳定运行的编程语言 ...
- Python 报错集合
1.django_error:HINT: Add or change a related_name argument to the definition for...报错, 详情见: https:// ...
- 翻转二叉树(深搜-先序遍历-交换Node)
题目:翻转二叉树,例如 4 / \ 2 7 / \ / \ 1 3 6 9 to 4 / \ 7 2 / \ / \ 9 6 3 1 已知二叉树的节点定义如下: class TreeNode { in ...
- luogu P2812 校园网络【[USACO]Network of Schools加强版】|Tarjan
题目背景 浙江省的几所OI强校的神犇发明了一种人工智能,可以AC任何题目,所以他们决定建立一个网络来共享这个软件.但是由于他们脑力劳动过多导致全身无力身体被♂掏♂空,他们来找你帮助他们. 题目描述 共 ...
- jQuery中的层级选择器
话不多说,请看效果: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> &l ...
- 使用.NET Core创建Windows服务 - 使用.NET Core工作器方式
原文:Creating Windows Services In .NET Core – Part 3 – The ".NET Core Worker" Way 作者:Dotnet ...
- Redis 使用消息隊列
關鍵函數 ListRightPush 生產消息 ListRightPop 消費消息 這是從右面增或取 左邊亦然
- Jenkins-部署java代码项目
实验环境: Jenkins:192.168.1.12 tomcat:192.168.1.7 一.新建远程代码Java项目仓库 说明:这边测试是在coding上注册账户,建立远程仓库,codin ...