V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wangyzj
V2EX  ›  程序员

Python 遇到一个列表问题,感觉很奇怪,也不知道怎么 Google,希望老哥们帮忙看看

  •  
  •   wangyzj · 2021-01-11 19:31:11 +08:00 · 1433 次点击
    这是一个创建于 1416 天前的主题,其中的信息可能已经有所发展或是发生改变。

    环境为 python3.5,ubuntu1604 看到一个库中对 list 做了继承 代码大意如下

    在看前人代码的时候发现对方使用 NewList([1,2,3], 3)['total']这类语法获得正确输出 但 l = NewList([1,2,3], 3)后 l.total 是正确输出的 l['total']是报错得:list indices must be integers or slices 不知道应该怎么解释这种情况

    class NewList(list):
    
        def __init__(self, iterable=None, _total=0):
            if iterable is not None:
                list.__init__(self, iterable)
            else:
                list.__init__(self)
    
            self.total = _total
    
            self.iterable = iterable or []
    
        next = __next__
    
    第 1 条附言  ·  2021-01-12 09:37:20 +08:00
    此贴终结

    不出意外是我的锅

    同一个方法两种不同类型的输出,一个参数控制

    很要命
    geebos
        1
    geebos  
       2021-01-11 19:35:59 +08:00
    我试了一下,第一种也是报错的
    wangyzj
        2
    wangyzj  
    OP
       2021-01-11 19:38:19 +08:00
    @geebos #1 可能是我的 sample 不准确吧,不过我也没发现其他关键的点
    但我的确遇到了这种问题,很奇怪
    理论上报错是对的
    ManjusakaL
        3
    ManjusakaL  
       2021-01-11 19:41:40 +08:00
    你试一下

    ```python
    a = list()
    a['total']
    ```

    不就懂了。。

    要理解的更清楚去背诵一下 Python Document 中 Language Reference Chap 3 Data Model 这章你就懂了
    skinny
        4
    skinny  
       2021-01-11 19:47:47 +08:00
    你这既不是 mapping 对象也没有实现自己的__getitem__方法当然会报错,tutorial 多读几遍……
    chenqh
        5
    chenqh  
       2021-01-11 20:07:20 +08:00
    感觉是复写了 __getitem__, .的写法需要 override __getattr__吧
    nthhdy
        6
    nthhdy  
       2021-01-11 20:10:40 +08:00
    > 在看前人代码的时候发现对方使用 NewList([1,2,3], 3)['total']这类语法获得正确输出

    不应该吧,再读读,真实运行一下。看是不是理解有误。如果这里的 NewList 真是像贴出来的代码这样定义的,这个表达式同样会报错的。
    wangyzj
        7
    wangyzj  
    OP
       2021-01-11 20:20:21 +08:00
    @nthhdy #6 但是如果有了 getitem 实现的话不应该单独赋值一个新的 var 后执行['total']报错
    zhanglintc
        8
    zhanglintc  
       2021-01-11 21:10:16 +08:00
    想想不应该会发生这种现象啊, 无论 `NewList()` 产生的对象是否赋值给 `l`, 它都是同一个类型的 `NewList` 对象, 不应该影响它的属性调用方式什么的.

    如果你给的例子的输出的确没有问题的话, 那这倒是个挺有意思的问题. 楼主可以再运行下贴点结果证明的确是这个现象么.
    nthhdy
        9
    nthhdy  
       2021-01-12 10:01:59 +08:00
    @wangyzj 你贴的实现没有 `__getitem__` 方法,就会用 list 的该方法,但是 list 下标不能接受字符串,抛出这个异常很正常。就像对 `[]['a']` 进行求值抛出的异常一样。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1892 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 16:25 · PVG 00:25 · LAX 08:25 · JFK 11:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.