这算不算 python 的小坑? - V2EX
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
haoc
V2EX    Python

这算不算 python 的小坑?

  •  
  •   haoc 2016-03-02 15:30:44 +08:00 4571 次点击
    这是一个创建于 3588 天前的主题,其中的信息可能已经有所发展或是发生改变。

    看到这个两行代码,把我吓住了:
    Python
    if []:
    print('False')

    竟然没有报类型错误? Python 不是强类型么?
    后来查了查 doc , if statement 在这里接受一个 expression 然后会调用 bool().
    然后 bool([]) == False,所以没有出现类型错误。 -- 如果理解没错的话

    感觉虽然这里没有出现[] == False 的问题但是这种 if [] 还是挺坑的,容易误导人。

    第 1 条附言    2016-03-02 16:19:32 +08:00
    哈哈,谢谢大家回复。
    关于这个问题我觉得有答案了,官方的 doc 里有比较明确的申明: https://docs.python.org/2/library/stdtypes.html#truth-value-testing

    当然这也不是 python 的坑,是我自己小白了。
    41 条回复    2016-03-03 15:15:16 +08:00
    9hills
        1
    9hills  
       2016-03-02 15:34:47 +08:00
    这个是 feature ,用处很多的,否则你判断字典和列表是不是空的,就复杂了
    bobuick
        2
    bobuick  
       2016-03-02 15:34:49 +08:00
    if 0:
    print 'i will not fuck'

    =。=这就是 py 咯
    gaoxt1983
        3
    gaoxt1983  
       2016-03-02 15:34:56 +08:00
    这算啥坑啊,这个很方便的……
    haoc
        4
    haoc  
    OP
       2016-03-02 15:38:27 +08:00
    @9hills 难道这里不应该显示生命么?比如字典空和 null ref 怎么区分?比如下面这种情况?
    a = None
    b = []

    print(bool(a))
    print(bool(b))
    Allianzcortex
        5
    Allianzcortex  
       2016-03-02 15:39:31 +08:00
    这就是 Python ……说的真对

    任何为空的 list,tuple 任何为 None 的对象,都是 False

    类型一时爽……
    haoc
        6
    haoc  
    OP
       2016-03-02 15:39:51 +08:00
    @gaoxt1983 坑的感觉是这里让人以为它进行了 cast 。然后有种弱类型的感觉。感觉容易误导人。
    est
        7
    est  
       2016-03-02 15:40:29 +08:00
    ruby 没这个坑,结果代码里到处都是 .present? .empty? .blank? 还特么是 active support 才提供。
    jarlyyn
        8
    jarlyyn  
       2016-03-02 15:41:06 +08:00
    pyhton 啥时候是强类型了?
    chuan
        9
    chuan  
       2016-03-02 15:41:32 +08:00
    这不是坑啊,正常的理解来说空字符串,空表都应该是 False 啊,很多人会 if my_list 这样写的。 lua 好像视 0 ,空字符为 True ,然而这才是例外啊
    haoc
        10
    haoc  
    OP
       2016-03-02 15:42:57 +08:00
    @bobuick 还是 py2 :)
    haoc
        11
    haoc  
    OP
       2016-03-02 15:45:05 +08:00
    @est 我不懂 ruby 。我是觉得这里的应该让用户显示的声明表达式。 bool()有点容易误导人。
    Zzzzzzzzz
        12
    Zzzzzzzzz  
       2016-03-02 15:46:15 +08:00
    chuan
        13
    chuan  
       2016-03-02 15:47:02 +08:00
    @haoc 显示调用 bool ?好像没什么语言这么做吧
    zhuangzhuang1988
        15
    zhuangzhuang1988  
       2016-03-02 15:50:15 +08:00
    对的, 是坑...
    haoc
        16
    haoc  
    OP
       2016-03-02 15:50:20 +08:00
    @Zzzzzzzzz 可能我没表达清楚。不是显示调用 bool 。是声明表达式: len(arr) == 0 这样比较明确吧。
    lxy
        17
    lxy  
       2016-03-02 15:52:28 +08:00
    大家都比较懒嘛,如果不嫌麻烦的话可以
    if a is not None and isinstance(a, list) and len(a) == 0:
    print('empty list')
    timonwong
        18
    timonwong  
       2016-03-02 15:53:56 +08:00
    Python2
    https://docs.python.org/2/reference/datamodel.html#object.__nonzero__
    object.__nonzero__(self)
    Called to implement truth value testing and the built-in operation bool(); should return False or True, or their integer equivalents 0 or 1. When this method is not defined, __len__() is called, if it is defined, and the object is considered true if its result is nonzero. If a class defines neither __len__() nor __nonzero__(), all its instances are considered true.

    Python3
    https://docs.python.org/3.1/reference/datamodel.html#object.__bool__
    object.__bool__(self)
    Called to implement truth value testing and the built-in operation bool(); should return False or True. When this method is not defined, __len__() is called, if it is defined, and the object is considered true if its result is nonzero. If a class defines neither __len__() nor __bool__(), all its instances are considered true.

    如果要判断元素空,比如一个 list ,用 len(l)
    如果要判断元素为 None, 用 is None
    haoc
        19
    haoc  
    OP
       2016-03-02 15:54:01 +08:00
    @zhuangzhuang1988 第一次看别人这么写诧异了好久。
    haoc
        20
    haoc  
    OP
       2016-03-02 15:55:04 +08:00
    @chuan 回错了人。可能我没表达清楚。不是显示调用 bool 。是声明表达式: len(arr) == 0 这样比较明确吧。
    zhuangzhuang1988
        21
    zhuangzhuang1988  
       2016-03-02 15:55:35 +08:00
    @haoc 对的 好多东西似乎写起来爽.项目大的时候真想骂娘..
    lovepython
        22
    lovepython  
       2016-03-02 15:56:34 +08:00
    这不是坑啊,
    我记得基础时,就说明了, [ ] ( ) None 都是假

    这是 python 特点,不让写那么多,简洁。哈哈
    haoc
        23
    haoc  
    OP
       2016-03-02 15:57:18 +08:00
    @Zzzzzzzzz 之前回错了。这个是说他引入了用 int 的 boolean 类是吧。那和这个 if 的有啥关系呢?
    haoc
        24
    haoc  
    OP
       2016-03-02 15:58:19 +08:00
    @lxy 我现在大致理解了。就是第一次看有点怪。
    hahastudio
        25
    hahastudio  
       2016-03-02 16:03:47 +08:00   1
    嗯,我不懂 /不习惯 falsy value ,所以它是坑
    strahe
        26
    strahe  
       2016-03-02 16:08:44 +08:00
    技巧和坑你确定分清楚了?
    mulog
        27
    mulog  
       2016-03-02 16:09:46 +08:00
    不算 只要记得有些地方需要对 None 和 empty list/dict 分开处理 这个特性还是很好用的
    不能一个人看到某个写法觉得奇怪就是坑吧?
    如果一门语言的一切写法你都觉得很合逻辑, 那很可能他和你已经会的一门语言基本差不多,那学来干什么。。
    觉得还是起码先看完官方 doc 才来说坑不坑的问题吧 不看 doc 就说被坑了实在是。。
    haoc
        28
    haoc  
    OP
       2016-03-02 16:10:12 +08:00
    @hahastudio 哈哈,好吧。我查到 python 有关于 truth value testing 的 doc 。是我小白了:)
    haoc
        29
    haoc  
    OP
       2016-03-02 16:13:46 +08:00
    @mulog 嗯。你都说的对。我是最近刚开始用 python 写一些东西,然后确实没有认真看过 doc ,有点想当然了。
    clino
        30
    clino  
       2016-03-02 16:16:35 +08:00
    我觉得这是一个很好的 feature
    我记得以前看过相关文档的,结果现在找不到说这个的文档了
    jarlyyn
        31
    jarlyyn  
       2016-03-02 16:17:39 +08:00
    @haoc

    如果你对强类型的定义是这个,那我不明白你为什么会有顶楼的疑惑……

    为什么会出现类型错误?

    你的理解是判断了[]==fasle 吧?

    就如同 3=='3'
    displayabc
        32
    displayabc  
       2016-03-02 16:18:13 +08:00
    @jarlyyn python 是强类型,动态类型
    haoc
        33
    haoc  
    OP
       2016-03-02 16:20:57 +08:00   1
    @clino 哈。文档在附言里那个链接有。
    imlonghao
        34
    imlonghao  
       2016-03-02 16:22:18 +08:00
    我感觉这个挺好的...
    jarlyyn
        35
    jarlyyn  
       2016-03-02 16:23:12 +08:00
    @haython

    强在哪呢……

    强类型之类,有什么标准么?

    难道就是一个 1+'1'么……
    haoc
        36
    haoc  
    OP
       2016-03-02 16:23:18 +08:00
    @jarlyyn 我不知道一个概念叫 truthy value. 然后一开始就给理解跑偏了。
    haoc
        37
    haoc  
    OP
       2016-03-02 16:29:37 +08:00
    @jarlyyn 强弱类型标准是比较模糊。但是官方那个 wiki 里写的很明确为啥 python 应该是强类型。
    chenxytw
        38
    chenxytw  
       2016-03-02 17:09:40 +08:00
    @jarlyyn 一般认为强类型是指在生命周期内对同一内存片段仅有唯一解释。
    noahlee
        39
    noahlee  
       2016-03-02 22:42:25 +08:00
    差点没反应过来, 就是个空列表, 挺方便的!
    happywowwow
        40
    happywowwow  
       2016-03-03 11:41:39 +08:00
    LZ 觉得 if 是用来判断 bool 值的
    所以觉得 python 里面把 [] 计算成 bool 值是个坑

    但是嘞 python 偷了很多懒 None () [] 什么的都是可以 if 的
    waner55
        41
    waner55  
       2016-03-03 15:15:16 +08:00
    https://www.python.org/dev/peps/pep-0008/#id45
    看 sequese

    > For sequences, (strings, lists, tuples), use the fact that empty sequences are false.
    >
    ```
    Yes: if not seq:
    if seq:

    No: if len(seq):
    if not len(seq):
    ```
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2678 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 11:45 PVG 19:45 LAX 03:45 JFK 06:45
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86