Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 类变量在赋值时失去作用域_Python_Scope_Initialization_Variable Assignment_Class Variables - Fatal编程技术网

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

Python 类变量在赋值时失去作用域,python,scope,initialization,variable-assignment,class-variables,Python,Scope,Initialization,Variable Assignment,Class Variables,我有一个关于赋值时类变量作用域持久性的问题 我有一个字典作为一个类variablle,一旦我在一个实例方法中为变量分配了另一个字典,范围似乎就丢失了,实例之间的值也不再持久化 下面是代码片段: class MyBaseClass(object): my_class_dict = {} def __init__(self): print "Keys length: ", len(self.my_class_dict) if not len(se

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

我有一个字典作为一个类variablle,一旦我在一个实例方法中为变量分配了另一个字典,范围似乎就丢失了,实例之间的值也不再持久化

下面是代码片段:

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(1初始化,作用域保持)

版本2(2次初始化,范围丢失)

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


因此,似乎只有在完全对象赋值时,作用域才会丢失。为什么会发生这种情况?原因是什么?

这完全是意料之中的。作用域没有“丢失”:通过分配给
self.my_class\u dict
,您可以创建一个实例属性,该属性会将具有相同名称的class属性隐藏起来。实例总是在类之前查找实例的属性,因此将首先找到新创建的变量。

感谢您的确认。这正是我所期望的。
Keys length:  0
Initializing my_class_dict.
Keys length:  1
{1: 2}
{1: 2}
Keys length:  0
Initializing my_class_dict.
Keys length:  0
Initializing my_class_dict.
{1: 2}
{1: 2}
Keys length:  0
Initializing my_class_dict.
Keys length:  1
{1: 2}
{1: 2}