Python构造函数的古怪

Python构造函数的古怪,python,class,oop,Python,Class,Oop,我有一个简单的代码: class bfs: vis=[] bags=[] def __init__ (self,x): for i in p: #initializes vis with len(p) zeroes self.vis.append(0) print self.vis self.vis[x]=1 #marks index x as visited p

我有一个简单的代码:

class bfs:
    vis=[]
    bags=[]
    def __init__ (self,x): 
        for i in p:    #initializes vis with len(p) zeroes 
            self.vis.append(0)
            print self.vis
        self.vis[x]=1   #marks index x as visited
        print self.vis

p=raw_input("Input values: ").split()
for i in range(0,len(p)):
    p[i]=int(p[i])

q=[]
for i in range(0,len(p)):
    q.append(bfs(i))

print
for i in q:
    print i.vis
如果我输入,比如说,任意3个数字,为什么我会得到这个输出:

[0]
[0, 0]
[0, 0, 0]
[1, 0, 0]
[1, 0, 0, 0]
[1, 0, 0, 0, 0]
[1, 0, 0, 0, 0, 0]
[1, 1, 0, 0, 0, 0]
[1, 1, 0, 0, 0, 0, 0]
[1, 1, 0, 0, 0, 0, 0, 0]
[1, 1, 0, 0, 0, 0, 0, 0, 0]
[1, 1, 1, 0, 0, 0, 0, 0, 0]

[1, 1, 1, 0, 0, 0, 0, 0, 0]
[1, 1, 1, 0, 0, 0, 0, 0, 0]
[1, 1, 1, 0, 0, 0, 0, 0, 0]
而不是像这样

[0]
[0, 0]
[0, 0, 0]
[1, 0, 0]
[0]
[0, 0]
[0, 0, 0]
[0, 1, 0]
[0]
[0, 0]
[0, 0, 0]
[0, 0, 1]

[1, 0, 0]
[0, 1, 0]
[0, 0, 1]

该程序似乎只是继续在所有创建的obj中使用一个数组。我不明白为什么。任何帮助都会增加。

问题是您正在将
vis
bags
定义为类的一部分(作为“属性引用”),而不是在构造函数中。请尝试以下方法:

class bfs:
    def __init__(self, x):
        self.vis = []
        self.bags = []
        # etc.
这可能有助于:

属性引用使用Python中用于所有属性引用的标准语法:obj.name。有效属性名称是创建类对象时类命名空间中的所有名称。因此,如果类定义如下所示:

class MyClass:
    """A simple example class"""
    i = 12345
    def f(self):
        return 'hello world'
然后MyClass.i和MyClass.f是有效的属性引用,分别返回一个整数和一个函数对象。类属性也可以指定给,因此您可以通过指定来更改MyClass.i的值

关于这一点,还有一个问题:

类属性通过直接引用类和通过类的任何实例都可用

注意:在Java中,静态变量(在Python中称为类属性)和实例变量(在Python中称为数据属性)都是在类定义之后立即定义的(一个带有static关键字,一个没有)在Python中,这里只能定义类属性;数据属性在
\uuuu init\uuuu
方法中定义。


可能重复的相关:这确实起到了作用。我不知道你必须用Python这样做。谢谢