Python 未初始化字典的类
我有一个带字符串和字典的简单类。当我创建类的多个对象时,显然字典没有正确初始化。所有对象的字典都包含上次创建的对象的条目。代码是:Python 未初始化字典的类,python,python-3.x,class,oop,dictionary,Python,Python 3.x,Class,Oop,Dictionary,我有一个带字符串和字典的简单类。当我创建类的多个对象时,显然字典没有正确初始化。所有对象的字典都包含上次创建的对象的条目。代码是: # a simple class with a string and a dictionary: class Myclass: name = "" valuedict = {} # a list for objects: mylist = [] # create 3 objects: for i in range(3): mc = M
# a simple class with a string and a dictionary:
class Myclass:
name = ""
valuedict = {}
# a list for objects:
mylist = []
# create 3 objects:
for i in range(3):
mc = Myclass()
mc.name = str(i)
mc.valuedict['name'] = str(i)
mylist.append(mc)
# disply objects in list:
for item in mylist:
print("-----------------")
print("name = ", item.name)
print("name in dict = ", item.valuedict['name'])
输出为:
-----------------
name = 0
name in dict = 2
-----------------
name = 1
name in dict = 2
-----------------
name = 2
name in dict = 2
名称字符串按预期为0、1和2,但字典中的名称在所有3个对象中均为2。问题在哪里?如何解决?感谢您的帮助。目前,
valuedict
是一个类对象。我相信您需要的是有单独的实例,在这种情况下,您需要一个构造函数(在Python中称为\uuuu init\uuu
)
更正后的类代码如下(self
指类的实例)
那么为什么
name
的行为方式不同呢?在第一个for循环中,您定义了name
,在这里您访问了一个valuedict
键,该键不存在,因此您选择了“下一个最好的东西”,即类变量<代码>名称没有此问题,因为您正在初始化它。可以找到更好的解释。所以您希望MyClass
的每个实例在valuedict
中都有唯一的值?您需要向类中添加def\uuu init\uuuu(self):
方法,并将它们指定为实例属性,例如self.valuedict={}
。关于OOP.OK的一些教程值得一读。我现在明白了。我之前在文档中看到过它,但忘了在这里添加它。但是为什么每个对象的名称
都不同呢?对于所有对象,这是否也应该是相同的?这里似乎存在差异。对于那个特定的情况,这是因为实际上您正在定义一个实例变量(尽管是隐式的)。对于字典,您首先访问字典的一个键,该键在实例中不存在,因此我们从类中获取它,从而使它被共享。@rnso请参阅,以获得比我更好的解释。
class Myclass:
def __init__(self):
self.name = ""
self.valuedict = {}