无法解释的Python字典问题
大家好,
我一直在尝试创建一个类,用字典来构建一种表格,但发生了一些非常奇怪的事情……这是我的代码:
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
。