Python __setitem__ 使用多个键时发生奇怪的事情

Strange thing when Python __setitem__ use multiple key

我不想在使用时测试密钥类型__setitem__。但奇怪的是,我发现使用多个键时,部分代码被省略了。这是我的测试 class:

class foo():
    def __init__(self):
        self.data=[[1,2],[3,4],[5,6]]

    def __getitem__(self, key):
        return self.data[key]

    def __setitem__(self, key, value):
        print('Key is {0}, type of key is {1}'.format(key,type(key)))
        self.data[key] = value

f = foo()

使用一键就可以:

>>>f[1] = [0,0]
   Key is 1, type of key is <class 'int'>
>>>f[1]
   [0, 0]

当使用两个键时,结果是正确的,但是为什么什么也没有打印出来

>>>f[1][1] = 100

>>>f[1][1]
   100

我是python的新人任何建议都将不胜感激!

f[1][1] = 0 等同于

f.__getitem__(1).__setitem__(1, 0)

它在您的自定义 class 上调用 __getitem__;这个 returns [0, 0][3, 4] 或存储在 f[1] 中的任何内容;在任何情况下,这个值都是一个普通的 Python list;然后在 list 上调用 __setitem__list.__setitem__ 不打印任何内容。

f[1] 调用您的 __getitem__,因此 returns 是一个列表([3,4] 在新初始化对象的情况下)。然后,第二个索引操作 f[1][1] 索引返回的对象,列表 [3,4],它不是您的 class 的实例,而只是一个列表类型(由您的 class).