Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.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_Python 3.x_Class_Oop_Dictionary - Fatal编程技术网

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 = {}