1. ホーム
  2. python

[解決済み】Pythonの文字列をコピーするにはどうすればいいですか?

2022-02-04 11:28:13

質問

私はこうしています。

a = 'hello'

の独立したコピーが欲しいだけです。 a :

import copy

b = str(a)
c = a[:]
d = a + ''
e = copy.copy(a)

map( id, [ a,b,c,d,e ] )

アウト[3]。

[4365576160, 4365576160, 4365576160, 4365576160, 4365576160]

なぜ、すべて同じメモリーアドレスで、かつ a ?

解決方法は?

あなたは 必要 を使用して、Pythonの文字列をコピーします。これらはイミュータブル(不変)であり copy モジュールは、このような場合、常にオリジナルを返します。 str() とか、文字列のスライス全体とか、空文字列との連結とか。

さらに、あなたの 'hello' の文字列は インターン ( 特定の文字列が ). Pythonは意図的に1つのコピーだけを保持しようとします。その方が辞書の検索が速くなるからです。

これを回避する一つの方法は、実際に新しい文字列を作成し、その文字列を元のコンテンツにスライスして戻すことです。

>>> a = 'hello'
>>> b = (a + '.')[:-1]
>>> id(a), id(b)
(4435312528, 4435312432)

しかし、今あなたがしていることは、メモリの無駄遣いです。結局のところ、これらの文字列オブジェクトを何らかの形で変異させることができるわけではありません。

もし、Pythonのオブジェクトがどれだけのメモリを必要とするかを知りたかったら、次のようにします。 sys.getsizeof() これは任意のPythonオブジェクトのメモリフットプリントを提供します。

コンテナの場合、これは ではなく メモリサイズの合計を計算するには、各コンテナに再帰的にアクセスする必要があります。

>>> import sys
>>> a = 'hello'
>>> sys.getsizeof(a)
42
>>> b = {'foo': 'bar'}
>>> sys.getsizeof(b)
280
>>> sys.getsizeof(b) + sum(sys.getsizeof(k) + sys.getsizeof(v) for k, v in b.items())
360

このとき id() を追跡して実際のメモリフットプリントを取得するか、オブジェクトがキャッシュされずに再利用された場合の最大フットプリントを推定します。