个人微信公众号:程序员宅急送
1、
tuple嵌套tuple类型一定要记得逗号
a = ((1))
b = ((1),)
这两个看起来好像也没什么差别嘛,就是一个都好而已
打印出来的结果却差很多!
print(type(a))
print(a)
print(type(b))
print(b)
"""
<class 'int'>
1
<class 'tuple'>
(1,)
"""
2、list运算时候的小坑
a=[1,2,3]
b=a;
a+=[4,5,6]
# a = a+[4,5,6]
print(a,b)
"""
使用+=打印结果
[1, 2, 3, 4, 5, 6] [1, 2, 3, 4, 5, 6]
第二种打印结果
[1, 2, 3, 4, 5, 6] [1, 2, 3]
"""
3、list的遍历删除
a = [11,22,33,44]
for i in a:
print(i)
a.remove(i);
print(a)
"""
11
33
[22, 44]
"""
这是由于,当我们删除第0个数据11之后,list中剩下[22,33,44]。
下一次循环我们遍历到了此时list的第1个,也就是33。
所以,如果想要全部删除,
(1)我们可以从后往前删除,
(2)循环判断list剩余数据,每次删除第一个
4、is和==的区别
is
比较的是两个整数对象的id值是否相等,也就是比较两个引用是否代表了内存中同一个地址。
==
比较的是两个整数对象的内容是否相等,使用==
时其实是调用了对象的__eq__()
方法。
首先我们运行下面这段代码
a=0
b=0
while(True):
if a is b:
print('%d is %d'%(a,b))
a+=1
b+=1
else:
print('%d is not %d'%(a,b))
break
a=0
b=0
while(True):
if a is b:
print('%d is %d'%(a,b))
a-=1
b-=1
else:
print('%d is not %d'%(a,b))
break
结果如下图
为什么a和b是两个对象,用is比较确实True呢?
因为python出于对性能的考虑做了一些优化,他将[-5,256]这个范围的整数都保存在了一个叫small_ints的链表中,我们使用就从里面去而不需要反复创建新的对象。
但是超过了这个范围,我们就会看到,即使数值一样,也不是一个对象。
然后我们再看下面这一段
a = 257
def main():
b = 257 # 第6行
c = 257 # 第7行
print(b is c) # True
print(a is b) # False
print(a is c) # False
if __name__ == "__main__":
main()
结果在注释上面了,
那么为什么b is c是True?
为什么会出现这样的结果,首先我们来说说Python程序中的代码块。所谓代码块是程序的一个最小的基本执行单位,一个模块文件、一个函数体、一个类、交互式命令中的单行代码都叫做一个代码块。上面的代码由两个代码块构成。
a = 257是一个代码块,main函数是一个代码块。
Python内部为了进一步提高性能,凡是在一个代码块中创建的整数对象,如果值不在small_ints缓存范围之内,但是在该代码块中已经存在一个值相同的整数对象,我们就直接引用该对象。
这条规则只对非负数和字符串有用。
我们可以打印id来证明一下
a = 257
def main():
b = 257
c = 257
print(id(a))
print(id(b))
print(id(c))
if __name__ == "__main__":
main()
打印结果如下图,可以看到b和c确实是一个对象