前言
Python系列是入坑之路系列的第一个系列,以后也会陆续更新本系列其他内容以及其他系列
这些坑有大有小,你可能某个时候能恰好地避免,但可能在另一个关键时候与它相逢,极大地浪费了宝贵的时间
所以,这里分享出来,希望能节约大家的时间
入坑之路
1. 函数的默认参数
函数的默认参数在Python中只会执行一次,即定义该函数的时候,默认参数会被初始化,之后在每次调用的时候,都会使用之前初始化过的参数。代码示例如下
def trap_list(i, li=[]):
'''列表默认参数'''
li.append(i)
return li
print(trap_list('trap')) # [out] ['trap']
print(trap_list('trap')) # [out] ['trap', 'trap']
def trap_dict(i, d={}):
'''字典默认参数'''
d[i] = i
return d
print(trap_dict(1)) # [out] {1: 1}
print(trap_dict(2)) # [out] {1: 1, 2: 2}
2. 浮点数
浮点数比较会得到意想不到的结果,代码示例如下
print(1 + 2 == 3) # [out] True
print(0.1 + 0.2 == 0.3) # [out] False
这是因为小数以二进制形式表示时的有穷性导致的。计算机的内存、cpu寄存器等等这些硬件单元都是有限的,只能表示有限位数的二进制位,因此存储的二进制小数就会和实际转换而成的二进制数有一定的误差
3. 深拷贝与浅拷贝
# 浅拷贝
d = {
'blog':1
}
trap_d = d
trap_d['blog'] = '知泥博客'
print(d, trap_d) # [out] {'blog': '知泥博客'} {'blog': '知泥博客'}
# 打印对象的标识符,多次打印数字会变化。但都是相同的
print(id(d), id(trap_d)) # [out] 2396008676232 2396008676232
# 深拷贝
from copy import deepcopy
trap_dict = deepcopy(d)
trap_dict['blog'] = '深拷贝后的知泥博客'
print(d, trap_dict)
# 再来看看它们的标识符,已经变得不一样了
print(id(d), id(trap_dict)) # [out] 2036268989320 2036520949800
有时,我们就像上面浅拷贝那样,直接得到一个拷贝的字典。但这样却会导致你预料之外的结果。重点在于,这样得到的两个字典的引用都指向同一个地址
解决方法就是是使用深拷贝 —— 深拷贝就是创建一个新的和原始字段的内容相同的字段,是两个一样大的数据段,所以两者的引用是不同的。之后新对象中的引用型字段发生改变,不会引起原始对象中的字段发生改变
不仅字典会这样,Python中其他可变类型如列表、集合都会有这种现象
4. & 和 and
# and 数值类型
if 1 and 2:
print(True)
else:
print(False)
# and 逻辑变量
if (2 > 1) and (3 > 2):
print(True)
else:
print(False)
# & 数值类型
if 1 & 2:
print(True)
else:
print(False)
# & 逻辑变量
if True & True:
print(True)
else:
print(False)
对于数值类型,&表示位运算,and则依据是否非0来决定输出
对于逻辑变量,则二者等同
上面的规律,对于 | 和 or 同样适用
小结
入坑之路都是一步一个脚印踩出来的,需要较为深入地了解一门技术的特性才能发掘。也希望大家不要重蹈覆辙
本期入坑之路就分享到这了,以后还会陆续更新,感谢大家关注
#该文章暂时没有评论