诡异的 Python 问题 (调教新手专用)

2019 年 10 月 8 日
 zemora

问题 1:

假设 x,y,z 是三个浮点数 (不考虑 inf 或者 NaN),请问下面的函数返回何值?

def test(x, y, z):
    return (x + y) + z == x + (y + z)

问题 2:

假设 n 是一个整数,请问下面的函数返回何值?

def test2(n):
    a = n
    b = n
    return a is b
5187 次点击
所在节点    Python
26 条回复
RicardoY
2019 年 10 月 8 日
1.True
2.True

不是这样的吗..
whoami9894
2019 年 10 月 8 日
让我猜猜,你是想说浮点数精度和小整数池吗
lance6716
2019 年 10 月 8 日
false false
zemora
2019 年 10 月 8 日
@RicardoY 你试试 a = b = 1.0, c=0.03
LG3xFA6kpn88HxEW
2019 年 10 月 8 日
第一题明显有时候会返回 False,不仅是 python,凡是实现了 IEEE 浮点数规范的语言都会出现 0.1+0.2 !== 0.3 的情况,写 js 的时候被坑了自己很多次
gunjianpan
2019 年 10 月 8 日
这不是单纯因为 浮点数不能表示全部小数
XIVN1987
2019 年 10 月 8 日
1、这个不确定吧,,有些浮点数能相等,,有些不相等,,跟具体值有关
2、这个也不确定,,就是楼上说的小整数池内存优化
BingoXuan
2019 年 10 月 8 日
1. 可能会有精度损失导致不等价于
2. 我记得好像是解析器会把整型的变量地址记录下来,两个值一样的整型变量其实比较的是同一个地址
XIVN1987
2019 年 10 月 8 日
对于整数,,判断是不是相等就行了,,何必要判断是不是同一个??这样没意义

对于 immutable object,,使用“is”没意义,,使用“==”就行了,,
chenstack
2019 年 10 月 8 日
1 浮点精度问题,有时为 False, 2 都是 True 的吧,n 的对象有被引用,销毁前都是同一个地址
另外这个老手都不一定知道: https://github.com/leisurelicht/wtfpython-cn
airborne007
2019 年 10 月 8 日
1,不确定,有时候是 True,有时候是 False
2,True
XIVN1987
2019 年 10 月 8 日
抱歉,7 楼我说错了,,题目 1 不确定,题目 2 是确定的,就是 True,,
我试过了,,test2(3)和 test2(30000)结果都是 True

a、b、n 都是同一个 object 的 lable,,它们都指向同一个 object
wodexiaogou
2019 年 10 月 8 日
@l1nyanm1ng 咦 我刚刚试了 5.6+6.1 结果是对的 ,5.6+6.2 也是对的,6.3 6.4 6.5 6.6 6.7 都是对的,但 5.6+6.8 结果错了,他等于 12.39999999999,但 5.6+6.9 结果又是对的了,这是为啥啊
aguesuka
2019 年 10 月 8 日
第一个可能是 True 也可能是 False。比如三个 0.0
ipwx
2019 年 10 月 8 日
有病的写法,有病的楼主。
aaronhua
2019 年 10 月 8 日
What the f*ck Python! 🐍
https://github.com/leisurelicht/wtfpython-cn
python 这些小问题影响不大,小心点避开雷区就行。
XIVN1987
2019 年 10 月 8 日
@ipwx
别这么说,,这些可能是考试 /面试题目,,都是变态老师和面试官出的,,大家也没办法,,
barnetime
2019 年 10 月 8 日
跑一下代码呗~
NSAgold
2019 年 10 月 8 日
IEEE754 的锅
“原来这是因为 IEEE754 浮点数算数标准,这个算数标准不使用小数点,而是使用分数和指数来表示小数,例如 0.5 会用 1/2 表示,0.75 用 1/2+1/4 表示,0.875 用 1/2+1/4+1/8 表示。然而有的小数无法使用有限的分数来表示,如 0.1,使用 1/16+1/32+1/256+1/512+...+1/8192+...表示,因此才造成了浮点数计算的误差。”(摘抄自网络)
wangchonglie
2019 年 10 月 8 日
真不知道写这些函数有什么意义, 除了让新人畏惧还能做什么呢?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.xtra.eu.org/t/607007

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX