2

1つの引数のみが渡されます。それでも、2つの引数が渡されたというエラーが発生します。-1に初期化されていませんheadtail

class Queue_demo:
    head=-1
    tail=-1
    a=[]

    def enqueue(data=10):
        if(head==-1 and tail==-1):
            head=head+1
            tail=tail+1
            a.append(data)
        else:
            tail=tail+1
            a.append(data)

    def dequeue():
        y=a[head]
        if(head==tail):
            head,tail=-1,-1
        else:
            head=head+1
        return y

q1=Queue_demo()
q2=Queue_demo()
q1.enqueue(12)

while(q1.tail==-1):
    print(q1.dequeue())
4

1 に答える 1

4

コードにはいくつかの問題があります。

selfエラーを直接引き起こしているのは、メソッドに引数を指定していないことです。q1.enqueue(12)Pythonを呼び出すと、これはに変換されQueue_demo.enqueue(q1, 12)ます。メソッドが呼び出されているオブジェクトは、最初の引数としてメソッドに渡されます。慣例により、通常は。という名前が付けられselfます。

これは、間違った数の引数エラーを乗り越えたときに発生する2番目の問題につながります。インスタンスは現在、インスタンス変数ではなくクラス変数headとにtailアクセスしているため、インスタンスはすべて同じデータメンバーのセットを共有します。a1つのキューにアイテムを追加すると、他のすべてのキューにもアイテムが表示されるため、これは非常に混乱します。

__init__これを修正するには、クラス定義で変数を定義するのではなく、コンストラクター(これは単にという名前のメソッド)でこれらの変数を作成する必要があります。__init__メソッドはおそらく次のようになります。

def __init__(self):
    self.head = -1
    self.tail = -1
    self.a = []

Pythonは他のプログラミング言語とは異なることが多いことを忘れないでください!メンバー変数を宣言する必要はありません。値として割り当てを開始するだけで、selfすべての設定が完了します。

于 2012-10-18T03:36:05.773 に答える