为什么多个列表索引可以与__getitem__一起使用,而不能与__setitem__一起使用?

康纳·斯潘格勒

考虑以下代码:

class multiDimList1(object):
    def __init__(self):
        self.data = [[[0, 1, 2], [3, 4, 5], [6, 7, 8]],
                    [[0, 1, 2], [3, 4, 5], [6, 7, 8]]]

    def __getitem__(self, index):
        print("MDL1 getitem")
        return self.data[index]

    def __setitem__(self, index, value):
        print("MDL1 setitem")
        index, row, col = index
        self.data[index][row][col] = value

    def __str__(self):
        return ','.join(str(e) for e in self.data)

class multiDimList2(object):
    def __init__(self):
        self.data = [[[0, 1, 2], [3, 4, 5], [6, 7, 8]],
                    [[0, 1, 2], [3, 4, 5], [6, 7, 8]]]

    def __getitem__(self, index):
        print("MDL2 getitem")
        return self.data[index]

    def __setitem__(self, index, value):
        print("MDL2 getitem")
        index, row, col = index
        self.data[index][row][col] = value

    def __str__(self):
        return ','.join(str(e) for e in self.data)

myMDL1 = multiDimList1()
myMDL2 = multiDimList2()

myMDL1[0, 0, 0] = 12
print(myMDL1)

myMDL2[0][0][0] = 12
print(myMDL2)

输出:

MDL1 setitem
[[12, 1, 2], [3, 4, 5], [6, 7, 8]],[[0, 1, 2], [3, 4, 5], [6, 7, 8]]
MDL2 getitem
[[12, 1, 2], [3, 4, 5], [6, 7, 8]],[[0, 1, 2], [3, 4, 5], [6, 7, 8]]

为什么我可以调用myMDL2[0][0][0]__getitem__适当地处理它,但是尝试分配给该索引却没有调用__setitem__

myMDL2[0][0][0] = 12通过__getitem__并以这种方式设置对正确索引的引用这意味着__setitem__永远不会调用我想在其中运行的任何其他代码

加布里埃尔

这是因为

myMDL1[0, 0, 0] = 12

相当于

myMDL1.__setitem__(index=(0,0,0), value=12)

然而,

myMDL2[0][0][0] = 12

相当于

myMDL2.__getitem__(index=0)[0][0] = 12

这意味着首先myMDL2[0]完成,我们得到它的第一项,最后我们将它的第一项设置为值12。

myMDL2[0][0][0] = 12
=> myMDL2.__getitem__(index=0)[0][0] = 12
=> [[0, 1, 2], [3, 4, 5], [6, 7, 8]][0][0] = 12
=> [[0, 1, 2], [3, 4, 5], [6, 7, 8]].__getitem__(index=0)[0] = 12
=> [0, 1, 2][0] = 12
=> [0, 1, 2].__setitem__(index=0, value=12)
=> [12, 1, 2]

不确定我是否很好地解释__setitem__了您的multiDimList2上的不是调用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么Quickbooks可以与Ubuntu一起使用,而不能与Fedora一起使用?

来自分类Dev

为什么它可以与$ scope一起使用,但不能与`this`一起使用?

来自分类Dev

LibreOffice为什么不能与HUD一起使用?

来自分类Dev

为什么模拟不能与AsyncTask一起使用?

来自分类Dev

LibreOffice为什么不能与HUD一起使用?

来自分类Dev

为什么childElementCount不能与jQuery一起使用?

来自分类Dev

为什么javascript“ this”不能与“ each”一起使用?

来自分类Dev

setuid为什么不能与mount一起使用?

来自分类Dev

为什么JQuery不能与CryptoJS一起使用?

来自分类Dev

为什么 grep 不能与 iostat 一起使用?

来自分类Dev

为什么 foreach 不能与 String 一起使用?

来自分类Dev

为什么这个简单的代码可以与`exit`一起使用,而不能与'_exit`一起使用呢?

来自分类Dev

为什么多个类选择器不能与removeClass一起使用

来自分类Dev

为什么APIPA不能与多个网络适配器一起使用?

来自分类Dev

为什么.SECONDARY不能与模式(%)一起使用,而.PRECIOUS可以呢?

来自分类Dev

为什么nnoremap不能与CtrlP一起使用而nmap可以工作?-VIM

来自分类Dev

为什么循环功能不能与空列表一起使用?

来自分类Dev

为什么jQuery Selectable插件不能与foreach生成的列表一起使用?

来自分类Dev

为什么循环功能不能与空列表一起使用?

来自分类Dev

为什么序列不能与验证列表一起使用

来自分类Dev

为什么此脚本不能与nohup一起使用,但是不能,不能呢?

来自分类Dev

为什么此脚本不能与nohup一起使用,但是不能,不能呢?

来自分类Dev

GET请求可与Postman一起使用,但为什么不能与ReactJS fetch一起使用?

来自分类Dev

Scala Puzzler:为什么head不能与toSet一起使用,而与Set一起使用呢?

来自分类Dev

为什么使用函数声明不能与Web Worker一起使用?

来自分类Dev

为什么@forward命名前缀不能与使用Sass的变量一起使用?

来自分类Dev

为什么auto关键字不能与函数指针的初始化列表一起使用?

来自分类Dev

为什么IPython的timeit不能与set原义一起使用?

来自分类Dev

为什么可可绑定不能与框架类的typedef一起使用

Related 相关文章

  1. 1

    为什么Quickbooks可以与Ubuntu一起使用,而不能与Fedora一起使用?

  2. 2

    为什么它可以与$ scope一起使用,但不能与`this`一起使用?

  3. 3

    LibreOffice为什么不能与HUD一起使用?

  4. 4

    为什么模拟不能与AsyncTask一起使用?

  5. 5

    LibreOffice为什么不能与HUD一起使用?

  6. 6

    为什么childElementCount不能与jQuery一起使用?

  7. 7

    为什么javascript“ this”不能与“ each”一起使用?

  8. 8

    setuid为什么不能与mount一起使用?

  9. 9

    为什么JQuery不能与CryptoJS一起使用?

  10. 10

    为什么 grep 不能与 iostat 一起使用?

  11. 11

    为什么 foreach 不能与 String 一起使用?

  12. 12

    为什么这个简单的代码可以与`exit`一起使用,而不能与'_exit`一起使用呢?

  13. 13

    为什么多个类选择器不能与removeClass一起使用

  14. 14

    为什么APIPA不能与多个网络适配器一起使用?

  15. 15

    为什么.SECONDARY不能与模式(%)一起使用,而.PRECIOUS可以呢?

  16. 16

    为什么nnoremap不能与CtrlP一起使用而nmap可以工作?-VIM

  17. 17

    为什么循环功能不能与空列表一起使用?

  18. 18

    为什么jQuery Selectable插件不能与foreach生成的列表一起使用?

  19. 19

    为什么循环功能不能与空列表一起使用?

  20. 20

    为什么序列不能与验证列表一起使用

  21. 21

    为什么此脚本不能与nohup一起使用,但是不能,不能呢?

  22. 22

    为什么此脚本不能与nohup一起使用,但是不能,不能呢?

  23. 23

    GET请求可与Postman一起使用,但为什么不能与ReactJS fetch一起使用?

  24. 24

    Scala Puzzler:为什么head不能与toSet一起使用,而与Set一起使用呢?

  25. 25

    为什么使用函数声明不能与Web Worker一起使用?

  26. 26

    为什么@forward命名前缀不能与使用Sass的变量一起使用?

  27. 27

    为什么auto关键字不能与函数指针的初始化列表一起使用?

  28. 28

    为什么IPython的timeit不能与set原义一起使用?

  29. 29

    为什么可可绑定不能与框架类的typedef一起使用

热门标签

归档