python中的一些小坑

个人微信公众号:程序员宅急送
在这里插入图片描述
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确实是一个对象
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值