类变量在赋值时失去作用域

3 投票
1 回答
1053 浏览
提问于 2025-04-18 12:37

我有一个关于类变量在赋值时作用域持久性的问题。

我有一个字典作为类变量,当我在实例方法中把另一个字典赋值给这个变量时,作用域似乎就消失了,导致不同实例之间的值不再保持一致。

下面是代码片段:

class MyBaseClass(object):
    my_class_dict = {}  

    def __init__(self):
        print "Keys length: ", len(self.my_class_dict)
        if not len(self.my_class_dict.keys()):
            print "Initializing my_class_dict."
            # VERION  1 
            # self.my_class_dict.update({1:2})
            # VERSION 2 
            # self.my_class_dict = {1:2}
            # VERSION 3             
            self.my_class_dict[1] = 2


class MyChildClass1(MyBaseClass):

    def __init__(self):
        super(MyChildClass1, self).__init__()


class MyChildClass2(MyBaseClass):

    def __init__(self):
        super(MyChildClass2, self).__init__()       

if __name__=='__main__':
    child_1 = MyChildClass1()
    child_2 = MyChildClass2()

    print child_1.my_class_dict
    print child_2.my_class_dict

这是运行结果。

版本 1(初始化一次,作用域保持)

Keys length:  0
Initializing my_class_dict.
Keys length:  1
{1: 2}
{1: 2}

版本 2(初始化两次,作用域消失)

Keys length:  0
Initializing my_class_dict.
Keys length:  0
Initializing my_class_dict.
{1: 2}
{1: 2}

版本 3(初始化一次,作用域保持)

Keys length:  0
Initializing my_class_dict.
Keys length:  1
{1: 2}
{1: 2}

看起来只有在完全赋值对象的时候,作用域才会消失。这是为什么呢?背后的原因是什么?

1 个回答

4

这完全是正常的现象。这里的“作用域”并没有“丢失”:当你给 self.my_class_dict 赋值时,你实际上是在创建一个实例属性,这个属性会覆盖掉同名的类属性。实例在查找属性时,总是先在实例本身找,如果找不到再去类里找,所以新创建的变量会优先被找到。

撰写回答