访问字段:如果存储在字典中,则为不同的值

Smr*_*row 5 python dictionary scope

我的问题看起来像这样.

# Module.py
class TestClass:
    name = "default"
    nameDict = {'name':"standard"}

    def __init__(self, name):
       self.name = name
       self.nameDict['name'] = name
Run Code Online (Sandbox Code Playgroud)

然后我打电话给另一个模块的字段.该类在之前启动,我在名称字段上调用如下:

Module.TestClass("newName")

# Inside another function
print(Module.TestClass.name)
print(Module.TestClass.nameDict['name'])
Run Code Online (Sandbox Code Playgroud)

这使:

default #name
newName #nameDict
Run Code Online (Sandbox Code Playgroud)

我不明白为什么会有不同的价值观.有谁知道为什么会这样?

谢谢你的时间.

Cyp*_*ase 3

这是个有趣的问题; 有很多事情发生。

Module.TestClass是您在“Module.py”中定义的类。使用Module.TestClass("newName"),您将创建该类的实例,但不会保存它。

当您这样做时,您正在打印 的属性print(Module.TestClass.name)值,该属性是而不是类的实例。您之前提供的实例不会更改的属性。nameModule.TestClassnamename

真正有趣的是print(Module.TestClass.nameDict['name'])。即使您仍在访问该类nameDict的属性,它也会受到您之前创建的实例的影响。这是因为 Python 变量保存对对象的引用。定义类时,您为类范围中的属性分配了一个字典。类的所有实例指向完全相同的字典对象因此,如果您在一个地方更改它,那么它在所有地方都会更改,因为它实际上是完全相同的 dictnameDict

这是完成您想要做的事情的好方法:

# Module.py

class TestClass(object):
    def __init__(self, name='default'):
        self.name = name
        self.nameDict = {'name': name}

# other.py

testclass_instance = Module.TestClass("newName")

# Inside another function
print(testclass_instance.name)  # newName
print(testclass_instance.nameDict['name'])  # newName
Run Code Online (Sandbox Code Playgroud)