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)
我不明白为什么会有不同的价值观.有谁知道为什么会这样?
谢谢你的时间.
这是个有趣的问题; 有很多事情发生。
Module.TestClass是您在“Module.py”中定义的类。使用Module.TestClass("newName"),您将创建该类的实例,但不会保存它。
当您这样做时,您正在打印 的属性print(Module.TestClass.name)值,该属性是类,而不是类的实例。您之前提供的实例不会更改类的属性。nameModule.TestClassnamename
真正有趣的是print(Module.TestClass.nameDict['name'])。即使您仍在访问该类nameDict的属性,它也会受到您之前创建的实例的影响。这是因为 Python 变量保存对对象的引用。定义类时,您为类范围中的属性分配了一个字典。类和类的所有实例都指向完全相同的字典对象。因此,如果您在一个地方更改它,那么它在所有地方都会更改,因为它实际上是完全相同的 dict。nameDict
这是完成您想要做的事情的好方法:
# 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)