V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
zemora
V2EX  ›  Python

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

  •  
  •   zemora ·
    neozhaoliang · 2019-10-08 13:55:55 +08:00 · 4253 次点击
    这是一个创建于 1867 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问题 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
    
    26 条回复    2019-10-08 21:47:42 +08:00
    RicardoY
        1
    RicardoY  
       2019-10-08 14:04:03 +08:00
    1.True
    2.True

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

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

    a、b、n 都是同一个 object 的 lable,,它们都指向同一个 object
    wodexiaogou
        13
    wodexiaogou  
       2019-10-08 16:27:34 +08:00
    @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
        14
    aguesuka  
       2019-10-08 16:45:23 +08:00 via Android
    第一个可能是 True 也可能是 False。比如三个 0.0
    ipwx
        15
    ipwx  
       2019-10-08 17:03:01 +08:00   ❤️ 7
    有病的写法,有病的楼主。
    aaronhua
        16
    aaronhua  
       2019-10-08 17:07:18 +08:00
    What the f*ck Python! 🐍
    https://github.com/leisurelicht/wtfpython-cn
    python 这些小问题影响不大,小心点避开雷区就行。
    XIVN1987
        17
    XIVN1987  
       2019-10-08 17:14:19 +08:00   ❤️ 1
    @ipwx
    别这么说,,这些可能是考试 /面试题目,,都是变态老师和面试官出的,,大家也没办法,,
    barnetime
        18
    barnetime  
       2019-10-08 17:31:45 +08:00
    跑一下代码呗~
    NSAgold
        19
    NSAgold  
       2019-10-08 20:34:38 +08:00 via Android
    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
        20
    wangchonglie  
       2019-10-08 20:47:37 +08:00
    真不知道写这些函数有什么意义, 除了让新人畏惧还能做什么呢?
    Kylin30
        21
    Kylin30  
       2019-10-08 20:58:55 +08:00   ❤️ 1
    问题 2 我好像记得大于 255 就是 false,小于 255 就是 true。
    iceking
        22
    iceking  
       2019-10-08 21:28:24 +08:00
    1. 浮点精度问题,不确定
    2. 小整数池子保证整数对象垃圾回收性能,不确定
    shakespaces
        23
    shakespaces  
       2019-10-08 21:28:37 +08:00
    @Kylin30 那是直接赋值,比如 a=1000 b=1000 a is b 返回 False,但是 n=1000 a=n b=n a is b 就返回 True,因为此时 a 和 b 赋值的时候其实指向了同一个对象
    yukun666
        24
    yukun666  
       2019-10-08 21:30:24 +08:00
    @Kylin30 好像范围是-5 到 256
    fy1993
        25
    fy1993  
       2019-10-08 21:33:01 +08:00
    In [4]: a = 'abc'

    In [5]: b = 'abc'

    In [6]: a is b
    Out[6]: True


    楼主看了这个是不是更怀疑了
    xlui
        26
    xlui  
       2019-10-08 21:47:42 +08:00   ❤️ 5
    为什么一个浮点数精度问题居然能被一而再再而三的发帖,这次居然没有加微信公众号,惊了。

    有点无语...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2808 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 07:26 · PVG 15:26 · LAX 23:26 · JFK 02:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.