2017-08-26 8 views
-4
例えば

function()の最初の実行時以前に「なし」と言及していた変数を変更できないのはなぜですか?

def function(data=None): 
    print(data,id(data)) 
    if data is None: 
     data=[] 
    print(data,id(data)) 

    data.append(1) 
    print("==================") 

function() 
function() 

>> None 1781798096 
[] 1780266168520 
================== 
None 1781798096 
[] 1780266174856 
================== 

data変数を「なし」オブジェクト(ID:1781798096)を参照するコードの第三の行では、今dataは、空のリストオブジェクトを参照(ID :1780266168520)functionの2回目の実行時には、dataのid値は1780266168520であると予想されます。しかし、驚くべきことに、dataが「なし」オブジェクトと呼ばれるときは同じ値になる1781798096が出力されます。

しかし、我々はいくつかの任意のリストにデフォルトのパラメータを変更する場合は、[0]と言う、

[0] 1780266149960 
[0] 1780266149960 
================== 
[0, 1] 1780266149960 
[0, 1] 1780266149960 
================== 

我々はそれが同一のID値を与えることを見つけます。

なぜ私は以前に "None"オブジェクトを参照していた変数を変更できないのですか?デフォルトパラメータを "None"と[0]に設定すると、そのような違いが発生するのはなぜですか?

+1

あなたの質問は意味をなさない。なぜ、ローカル変数が関数呼び出しで値を保持しないのか尋ねていますか? – melpomene

+0

@melpomeneデフォルトのパラメータを任意のリストに変更すると、id値がまったく同じであることが分かります。デフォルトのパラメータを "None"に設定すると、そのような違いが生じるのはなぜですか? – Jin

+0

あなたが何を言っているのか分かりません。 – melpomene

答えて

3

dataの値が最初は同じであることを尋ねるのであれば、デフォルトの引数は関数が定義されたときに一度初期化され、プログラム全体に残るためです。それが"Least Astonishment" and the Mutable Default Argumentの理由でもあります。 dataが再割り当てされ

は、たまたまその全ては、新しいオブジェクト(空のリスト)を指すことがあり、このオブジェクトは、又は(しばしばREPLセッションガベージコレクションの変数の同じidsを再利用)同じidを有していてもいなくてもよいです。

+0

'data'が再割り当てされると、新しいオブジェクト([])を指します。だから私は 'データ 'はもはや'なし 'を指していないと思いますか? – Jin

+0

@Jinあなたはそうです、それぞれの割り当ての後に別の '[]'を指します。 –

+0

@COLDSPEED次に、[なし]ではなく[]を指している場合、 'data'のid値は、' function'の2回目の実行後に「None」のid値と同じになるのはなぜですか? – Jin

0

Noneはシングルトンオブジェクトなので、NoneTypeのオブジェクトを複数作成しないでください。 (シングルトンクラスの複数のオブジェクトを作成することができます。 Pythonでは、保持している値を常に変更するとは限りません。オブジェクトのメソッドを呼び出したり、変更したり、新しいオブジェクトを作成したり、変数への参照を割り当てることができます。以前は、Noneオブジェクトへの参照を変更したときに、他のオブジェクトへの参照を保持していました。 Noneを指定したときと同じですが、PythonはNoneを参照して参照値を初期化します。

0

引数を指定しないで関数を呼び出すと、function()と入力するとNoneに設定されます。 dataの値を保持する場合は、data変数を返し、2番目の呼び出しでfunction()に渡す必要があります。

関連する問題