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 · 4004 次点击
    这是一个创建于 3167 天前的主题,其中的信息可能已经有所发展或是发生改变。

    看到这个两行代码,把我吓住了:
    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'
    haython
        32
    haython  
       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   ·   实用小工具   ·   1182 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 18:26 · PVG 02:26 · LAX 11:26 · JFK 14:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.