Python中'//'的作用是什么?

495 投票
5 回答
380728 浏览
提问于 2025-04-15 14:54

我在某人的代码中看到了这个:

y = img_index // num_images

这里的 img_index 是一个正在运行的索引,而 num_images 是 3。

当我在 IPython 中玩弄 // 时,它似乎和一个普通的除号(也就是一个斜杠)表现得一样。我只是想知道,为什么要用两个斜杠呢?

5 个回答

27

为了补充其他的回答,// 这个运算符在进行整数除法时,性能上比 / 提高了三倍。

$ python -m timeit '20.5 // 2'
100,000,000 loops, best of 3: 14.9 nsec per loop

$ python -m timeit '20.5 / 2'
 10,000,000 loops, best of 3: 48.4 nsec per loop

$ python -m timeit '20 / 2'
 10,000,000 loops, best of 3: 43.0 nsec per loop

$ python -m timeit '20 // 2'
100,000,000 loops, best of 3: 14.4 nsec per loop
219

// 是一种无条件的“向下取整除法”,比如:

>>> 4.0//1.5
2.0

如你所见,即使两个操作数都是 float(浮点数),// 仍然会向下取整——所以你总是可以放心地知道它会怎么做。

而单独的 / 是否向下取整,可能会根据 Python 的版本、未来的导入设置,甚至运行 Python 时的标志而有所不同,比如:

$ python2.6 -Qold -c 'print 2/3'
0
$ python2.6 -Qnew -c 'print 2/3'
0.666666666667

如你所见,单独的 / 可能会向下取整,或者 返回一个浮点数,这完全取决于一些非本地的因素,包括 -Q 标志的值...;-)

所以,如果你确定想要向下取整,一定要使用 //,这样可以保证结果。如果你确定不想向下取整,可以在另一个操作数外面加上 float(),然后使用 /。其他任何组合,你就得看版本、导入和标志的情况了!-)

639

在Python 3中,使用/这个符号会进行浮点数除法,也就是结果会保留小数部分。而新增的//符号则是用来进行整数除法的,也就是只保留商,不保留余数。相比之下,在Python 2中,/这个符号默认是进行整数除法,只有当其中一个数字是浮点数时,才会进行浮点数除法。

在Python 2.X中:

>>> 10/3
3
>>> # To get a floating point number from integer division:
>>> 10.0/3
3.3333333333333335
>>> float(10)/3
3.3333333333333335

在Python 3中:

>>> 10/3
3.3333333333333335
>>> 10//3
3

想了解更多,可以查看PEP238

撰写回答