0

当我执行这个 python 代码时,它会生成下面的输出。

class A(object):
    a = 0
    n = {}

    def inc(self):
        self.a += 1

    def add(self, key, obj):
        self.n[key] = obj

    def printn(self):
        print self.a
        print self.n


b = A()
c = A()

b.add("asf", "----")
c.add("asdf", "====")

b.inc()
c.inc()

b.printn()
c.printn()

输出:

1
{'asf': '----', 'asdf': '===='}
1
{'asf': '----', 'asdf': '===='}
4

2 回答 2

5

n这个问题与字典无关。这n是一个类属性而不是实例属性。这意味着该类的所有实例共享一个值。

解决方案只是将其转换为实例变量——在方法(通常是__init__方法)中而不是在类定义中分配它。

class A(object):
    def __init__(self):
        self.n = {}

你可能会问为什么同样的事情不会发生在a. 嗯,确实如此。您正在创建一个 shared a,就像n.

但是您没有在共享上调用任何a更改它的方法(实际上,您不能,因为int它是不可变的;它没有任何更改它的方法)。有了n,这self.n[key] = object可能看起来不像是一个方法调用(实际上是self.n.__setitem__(key, object)),但很明显它正在n就地改变值,这是这里的关键。

您只是为self.a. 这会创建一个新的实例属性,它会隐藏同名的类属性——这很令人困惑,但它可以按照您的意愿工作。n如果您想通过构建一个新值并将其分配给以下方式,您可以获得相同的行为self.n

def add(self, key, obj):
    new_n = copy.copy(n)
    new_n[key] = obj
    self.n = new_n
于 2013-08-30T23:23:20.983 回答
0
n = {}

这与其他语言不同。在其他语言中,您可能希望它声明一个实例属性,该属性始终使用空字典进行初始化。在 Python 中,它创建一个类属性。所有实例共享相同的n.

要修复它,请编写一个构造函数并将属性设置为self

def __init__(self):
    self.a = 0
    self.n = {}
于 2013-08-30T23:23:24.653 回答