11

私は次のことに気づいています:

class c:
  def __init__(self, data=[]):
    self._data=data
a=c()
b=c()
a._data.append(1)
print b._data
[1]

これは正しい動作ですか?

4

3 に答える 3

12

はい、正しい動作です。

しかし、あなたの質問から、それはあなたが期待したものではないようです。

期待に応えたい場合は、次の点に注意してください。

ルール 1. 変更可能なオブジェクトをデフォルト値として使用しないでください。

def anyFunction( arg=[] ):

新しいリスト オブジェクトを作成しません。のデフォルトのリスト オブジェクトは、argすべての場所で共有されます。

同様に

def anyFunction( arg={} ):

新しい dict オブジェクトを作成しません。このデフォルトの辞書は共有されます。

class MyClass( object ):
    def __init__( self, arg= None ):
        self.myList= [] if arg is None else arg 

これは、新しい空のリスト オブジェクトである既定の引数値を提供する一般的な方法です。

于 2010-02-22T18:23:36.683 に答える
4

これは古典的な落とし穴です。http://zephyrfalcon.org/labs/python_pitfalls.htmlのセクション 5:「変更可能なデフォルト引数」を参照してください。

于 2010-02-22T18:24:05.553 に答える
1

次に、常に次のような関数を作成します。

def __init__ ( self, data = None ):
    if data is None:
       data = []

    self._data = data

または、 を使用することもできますが、これにより、ユーザーが空のパラメーター ( 、など)をdata = data or []渡すことができなくなります。''0False

于 2010-02-22T18:34:47.520 に答える