我有这个简单的代码:
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中的一个数组。我不明白为什么。任何帮助都会膨胀。
答案 0 :(得分:2)
问题在于,您将定义vis
和bags
定义为类的一部分(作为“属性引用”),而不是在构造函数中定义。试试这个:
class bfs:
def __init__(self, x):
self.vis = []
self.bags = []
# etc.
documentation for class objects可能有所帮助:
属性引用使用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中,这里只能定义类属性;数据属性在
__init__
方法中定义。