0

我有这个简单的代码:

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 中的一个数组。我不明白为什么。任何帮助都会膨胀。

4

1 回答 1

2

问题是您正在定义定义visbags作为类的一部分(作为“属性引用”),而不是在构造函数中。试试这个:

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 的值。

还有一个关于这个的Dive Into Python 页面

类属性既可以通过直接引用类,也可以通过类的任何实例获得。

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

于 2013-10-09T22:51:06.757 回答