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]

プログラムは、作成されたすべてのオブジェクトで 1 つの配列を操作し続けているようです。理由がわかりません。どんな助けでもうねるでしょう。

4

1 に答える 1

2

問題は、コンストラクターではなく、クラスの一部として (「属性参照」として) visandを定義していることです。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 の値を変更できます。

これに関するDive Into Python ページもあります。

クラス属性は、クラスへの直接参照とクラスの任意のインスタンスの両方で利用できます。

注: Java では、静的変数 (Python ではクラス属性と呼ばれる) とインスタンス変数 (Python ではデータ属性と呼ばれる) の両方が、クラス定義の直後に定義されます (static キーワードのあるものとないもの)。Python では、ここで定義できるのはクラス属性のみです。データ属性は__init__メソッドで定義されます。

于 2013-10-09T22:51:06.757 に答える