2017-08-18 6 views
-2

に新しいオブジェクトを作成する場合PythonはY、すべての3つの名前xに対してメモリ内の同じ整数オブジェクトを使用してZPythonは次の例では、メモリ

def main(): 
    x = 0 
    y = 0 
    z = 0 
    print(x,y,z) 
    print(x is y is z) 
    y = 2 
    print(x,y,z) 
    print(x is y) 
    print(z is y) 
    print(x is z) 

if __name__ == "__main__":main() 

出力:

0 0 0 
True 
0 2 0 
False 
False 
True 

なぜPythonが同じタプルオブジェクトを使用しないのですか(そうです、それは言語デザイナーの選択ですが、どうしてですか?)、質問するのがより簡単です。

def main(): 
    a = 1, 2, 3 
    b = (1, 2, 3) 
    c = 1, 2, 3 

    print(type(a) == type(b)) 
    print(a == b) 
    print(a is b) 
    print(a == c) 
    print(a is c) 

if __name__ == "__main__":main() 

出力:可変オブジェクトを表しリテラルについては

True 
True 
False 
True 
False 
+3

あなたの質問にコードの画像をダンプすることはできませんか?それはちょうど_pasting_のスターリングオプションが常にあります。 –

+2

Pythonが新しいオブジェクトを作成するとき、実装依存です。実際には、文字列リテラルは再利用され、 'intern()'に渡された文字列は再利用され、小さな整数は再利用され、空のタプルは再利用されます。すべての不変オブジェクトを再利用することと、再利用可能な不変オブジェクトを追跡することとの間にはトレードオフがあります。 – kindall

+0

@cᴏʟᴅsᴘᴇᴇᴅ:質問者は 'is'と' == 'の違いを知っています。問題は、タプルが異なるオブジェクトである理由、なぜ 'is'と' == 'が別のものを報告するのかという理由ではありません。 – user2357112

答えて

2

、リテラルのすべての評価は、新しいオブジェクトを生成する必要があります。

不変オブジェクトを表すリテラルでは、新しいオブジェクトが作成されるかどうかは、任意の実装の詳細になります。同じタプルを使用することもできます。将来のリリースで、あるいは別のPython実装で同じタプルを使用する可能性があります。 mainを繰り返し呼び出しますが、ab、およびcの異なるタプルを繰り返し呼び出した場合、実際にはの例はです。あなたはそれが一方的であるか他者性であるかに頼るべきではありません。

あなたはこのような場合のために特定の実装の詳細を確認したい場合は、CPython bytecode compilerは通常(メカニズムが合併から1.01のようなものを維持するためにいくつかの余分な作業で、辞書を伴う)コードオブジェクトで一緒同等の定数をマージし、 3つのタプルを事前に計算するpeephole optimization passは、重複排除機構を備えていない後処理フェーズで発生します。

+0

おかげで、私はより良いコーダーになりました。実際に私は同じ考えをしていましたが、Pythonはメモリ内のタプルを再利用すると予想しました。 – pouya