2016-09-05 5 views
3

私の2つのケースは、Python 2.7が重複する文字列リテラルHelloを格納しているか、文字列リテラルHelloを1つ格納していて、ありがとう。Python 2.7の重複した文字列かどうか

私の2つのケースでは、文字列リテラルを使用し、文字列(str)を使用しています。

from collections import defaultdict 

a = defaultdict(list) 
# case 1 
a[1].append("Hello") 
a[2].append("Hello") 

# case 2 
b = "Hello" 
a[3].append(b) 
a[4].append(b) 

答えて

4

ケース2の場合、同じオブジェクトが明示的に実行されるため、同じオブジェクトが2回参照されていると考えるのは安全です。 Pythonのリファレンスを常に捨てることを覚えておいてください。同時に、最初のケースはもう少し複雑です。 CPythonは短い文字列(および小さな数字も)をキャッシュすることによってメモリ使用量を最適化します。 Trueを返しa is bつまり

In [1]: a = "Hello" 

In [2]: b = "Hello" 

In [3]: id(a) 
Out[3]: 4448951296 

In [4]: id(b) 
Out[4]: 4448951296 

。しかし、これはあなたが依存できるものではありません。異なるバージョンとビルドの間でサイズのしきい値が異なる可能性があるからです。

In [8]: c = "Quite a long string this is. It's supposed to demonstrate CPython's tweaks" 

In [9]: d = "Quite a long string this is. It's supposed to demonstrate CPython's tweaks" 

In [10]: c is d 
Out[10]: False 
+1

私の実験から、単語がない文字に遭遇するとすぐに 'c is d 'が真でなくなります。 – daragua

+1

@ダラグア私はそれに気づいていません。私の経験では、ちょうど長さのしきい値があります。唯一のアルファベット文字が存在しているものの、例えば 'C = "qwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfhjklzxcvbnm"'と 'dは= "qwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfhjklzxcvbnm" の' 'Cは、D '戻り' false'にあります。 –

+1

'c =" azerty "'と 'd =" azerty "'、 'c is d'はFalseであるため、少なくとも2つの条件があるように見えます。あなたの長い文字列のため、BTW '' azerty ''' azerty "'は 'True'です。 – daragua

関連する問題