无法解释的Python字典问题

1 投票
6 回答
1714 浏览
提问于 2025-04-16 09:21

大家好,

我一直在尝试创建一个类,用字典来构建一种表格,但发生了一些非常奇怪的事情……这是我的代码:

class dbase:
    def __init__(self):
        self.rows = {}
        self.cols = {}
    def addrow(self, name):
        self.rows[name] = self.cols
    def addcol(self, name):
        for x in self.rows:
            self.rows[x][name] = None
    def printit(self):
        for x in self.rows:
            print x, self.rows[x]
a = dbase()
a.addrow("coke")
a.addcol("price")
a.printit()
a.addrow("sprite")
a.printit()

好吧,奇怪的事情是,我的程序打印出的精灵行显示有一个内部字典,里面有一个“价格”的值,但在我的程序中,我并没有说过 self.cols["price"] = None。

那么,为什么精灵的 addrow 函数会把这个内部字典放进去呢?

谢谢大家的帮助!

6 个回答

1

当你调用 a.addcol("price") 这个代码时,它会修改 self.rows[x][name],把它的值设为 None

所以,self.cols 就变成了一个字典 {'price': None}。因为每个 self.rows[x] 都被设置成和 self.cols 一样,所以每次打印出来的都是同一个字典。

4

哇,这段代码真是太乱了。我看到的代码中,这个是最糟糕的。你知道吗,当你添加一行的时候,其实你只是把每一列都有的那个字典又加了一遍。

def __init__(self):
    self.rows = {}
    self.cols = {}
def addrow(self, name):
    self.rows[name] = self.cols

我想你是想说

def addrow(self, name):
    self.rows[name] = {}
3

self.rows 中的每个值都被赋值为 self.cols,所以它们共享同一个字典作为键。如果你修改了 self.rows[x],那么 self.rows[y] 也会被修改,因为它们是同一个对象。同样地,如果你之后把 self.cols 重新添加为 self.rows[z] 的值,它的内容也都是一样的,因为它仍然是同一个对象。

如果你想每次为行创建一个单独的空字典,那就这样做:赋值为 {}

不过其实你根本不需要为这个创建一个类;这样做只是让你使用一个自定义的接口,而这些在 Python 中本来可以直接完成。你可能还应该看看 collections.defaultdict

撰写回答