wtfPython是github上的一个项目,作者收集了一些奇妙的Python代码片段,这些代码的输出结果会和我们想象中的不太一样,
通过探寻产生这种结果的内部原因,可以让我们对Python里的一些细节有更广泛的认知。
<强> 1。字典键的隐式转换强>
some_dict={} some_dict [5.5]=癛uby” some_dict [5.0]=" JavaScript " some_dict [5]=" Python "
输出如下:
,祝辞祝辞的在some_dict
引用>
{5.0:“Python 5.5:“Ruby”}
在在在some_dict [5.5]
“Ruby”
在在在some_dict [5.0]
“巨蟒”
在在在some_dict [5]
“巨蟒”原因:
Python的字典键的比较是通过哈希值来比较的
在Python里如果两个不可变对象的值相等,那他们的哈希也是一样的
因此此处散列(5)==哈希(5.0)是真实的,所以键被隐式的转换了
<强> 2。生成器执行时间的差异强>
数组=(1、8、15) g=(x x在数组如果array.count (x)的在0) 数组=[2,8,22]输出:
,祝辞祝辞的在print(列表(g))
引用>
[8]原因
在一个生成器表达式里,在的操作是在声明时求值的,而如果是在运行期求值的
所以在运行期之前,数组已经被重新分配成了[2,8,22],x的值也是2,8,22日
<强> 3。在列表迭代式删除项目强>
list_1=(1、2、3、4) list_2=(1、2、3、4) list_3=(1、2、3、4) list_4=(1、2、3、4) idx,项列举(list_1): 德尔项 idx,项列举(list_2): list_2.remove(项) idx,项列举(list_3 [:]): list_3.remove(项) idx,项列举(list_4): list_4.pop (idx)输出:
,祝辞祝辞的在list_1
引用>
(1、2、3、4)
在在在list_2
(2、4)
在在在list_3
[]
在在在list_4
(2、4)原因
其实只有list3才算是合格的写法,对一个正在迭代的对象进行修改并不是一个很好的选择,正确的做法应该是建立一份该对象的拷贝来进行迭代
对于list1,德尔项目删除的只是项变量而不是变量指向的数据,对列表本身没有影响
对于用于和list4,因为列表的迭代是根据索引来的,第一次删掉了索引为0的1,剩下(2、3、4),然后移除索引1(此时为3),剩下了(2、4),此时只有2个元素,循环结束
<强> 4.其他的不同处理强>
对于循环的其他
def does_exists_num (l, to_find): 全国矿工工会的李: 如果num==to_find: 打印(“存在!”) 打破 其他: 打印(“不存在”)输出:
,祝辞祝辞的在some_list=[1、2、3、4、5)
引用>
在在在does_exists_num (some_list, 4)
存在!
在在在does_exists_num (some_list, 1)
不存在
对于尝试其他的
试一试: 通过 除了: 打印(“异常发生! ! !”) 其他: 打印(“Try块成功执行…”)输出:
Try块成功执行…
引用>原因
循环后的其他只会在经过了所有迭代且没有出现休息的时候才会执行
一个试模块后其他的会在尝试里的代码成功执行完后去执行
<强> python 5.里的是强>
在在在一个=256 在在在b=256 在在在a是b 真正的 在在在一个=257 在在在b=257 在在在a是b 假原因
是和==是不一样的;是判断的是两个对象是否是同一个对象,而==判断的是两个对象的值是否相等,即是是既要值相等又要引用一致
在Python中5 ~ 256年因为被经常使用所以被设计成固定存在的对象
<强> 6。循环里的局部变量泄露强>
代码段1
x的范围(7): 如果x==6: 打印(x,“: x内循环”) 打印(x, x”:在全球的)wtfPython-Python中一组有趣微妙的代码【收藏】