2

Pythonに問題があり、信じられませんでした。次のコードを参照してください。

class Container(object):
    array = []

    def __init__(self):
        print self.array

for i in range(0, 5):
    container = Container()
    container.array.append('Test')
print 'Last Container:', container.array

出力は次のとおりです。

[]
['Test']
['Test', 'Test']
['Test', 'Test', 'Test']
['Test', 'Test', 'Test', 'Test']
Last Container: ['Test', 'Test', 'Test', 'Test', 'Test']

Containerクラスはインスタンス化の一番上の値で初期化されると思いました。なぜそうではないのですか?

ありがとうございました!

4

3 に答える 3

6

内部のコードclass:は、クラスのインスタンスが作成されるときではなく、クラスが作成されるときに実行されます。これをより明確に示す例を次に示します。

>>> class Test(object):
...     print "Test"
...     def __init__(self):
...         print "init"
...
Test
>>> t = Test()
init

Testオブジェクトを作成したときではなく、クラスが作成されたときに「Test」が出力されたことに注意してください。

他の回答が指摘しているように、属性を(クラスのすべてのインスタンスではなく)クラスの特定のインスタンスに対してローカルにする場合は、コードを__init__メソッド内に配置する必要があります。

def __init__(self):
    self.array = []
于 2012-06-10T17:51:45.687 に答える
4

クラス定義内に直接配置する属性はすべてクラス属性であるため、Container.arrayのすべてのインスタンス間で共有されますContainer

代わりにインスタンス属性が必要な場合は、 :self.array = []内に設定してください。__init__()

    def __init__(self):
        self.array = []
        print self.array
于 2012-06-10T17:48:06.057 に答える
3

次のように__init__でリストをインスタンス化する必要があります。

class Container(object):

    def __init__(self):
        self.array = []
        print self.array

クラスの最上位で定義されたクラス変数は実行時に作成されるため、リストや辞書のように変更可能である場合は、変更するとこの問題が発生します。initで設定された属性は、クラスがインスタンス化されるときに作成されます。つまり、オブジェクトごとに新しいリストを取得します。

于 2012-06-10T17:46:45.027 に答える