2014-07-17 4 views
42

나는이 수행어떻게 파이썬 문자열을 복사 할 수 있습니까?

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 사본을 어떻게 얻을 수 있습니까?

+2

은 (완전히 정확 명시된 바와 같이하지만 반드시 질문에 대답하지 않습니다) Martijin의 당신이 수도 다른 대답하려면 내 학습 경험이 코드에서 온 ** 자세한 내용을 보여주기 위해 사용 사례를 제공하고 싶은 이유 **를 복사하려고합니다. – elmo

+4

@elemo가 암시 하듯이, 이것은 [XY 문제] (http://www.perlmonks.org/?node=XY+Problem) 일 수 있습니다. – martineau

+2

'd [ 'hello'] = e' 형식의 중첩 된 사전의 메모리 사용량을 추정하는 데 관심이있었습니다. 여기서 e [ 'hi'] = 'again ''입니다. 그런 중첩 된 사전을 생성하기 위해 나는 하나의'e' 사전을 생성하고 여러 번 복사했습니다. 나는 메모리 소비가 매우 낮다는 것을 알아 차렸고, 이것이 내 질문에 이르렀다. 이제는 문자열 복사본이 만들어지지 않았으므로 메모리 사용량이 적다는 것을 알고 있습니다. –

답변

92

파이썬 문자열을 복사하려면이 필요하지 않습니다. 그것들은 변경 가능하지 않고 copy 모듈은 항상 str()처럼 전체 문자열 슬라이스와 빈 문자열로 연결하여 원본을 반환합니다.

또한 'hello' 문자열은 입니다. (certain strings are)입니다. 파이썬은 고의적으로 하나의 복사본 만 남기려고합니다. 그러면 사전 검색이 빨라집니다. 당신이이 문제를 해결할 수

한 가지 방법은 실제로 원래의 내용에 해당 문자열을 다음 새로운 문자열을 생성 슬라이스하는 것입니다

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

을하지만 당신이 지금하고있는 모든 폐기물 메모리입니다. 그것은 결국 어떤 식 으로든 이러한 문자열 객체를 변형 할 수있는 것처럼 아닙니다.

파이썬 객체에 필요한 메모리 양을 알고 싶다면 sys.getsizeinfo()을 사용하십시오. 파이썬 객체의 메모리 사용량을 제공합니다.

컨테이너의 경우 이 아닌의 내용을 포함합니다. 당신은 총 메모리 크기를 계산하기 위해 각각의 용기에 재귀 적으로해야 할 것 :

>>> 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() 추적을 사용하도록 선택할 수 있습니다 .

당신은 문자열 형식을 통해 파이썬에서 문자열을 복사 할 수 있습니다
+3

'b = ''.join (a)'와 같이 새로운 문자열 객체를 생성하는 방법은 여러 가지가 있습니다. – martineau

+0

@martineau : 확실히, 나는 '일방 통행'이라고 말하려고했습니다. –

+10

"파이썬 문자열을 복사 할 필요가 없습니다." 이러한 연산이 단순히 동일한 문자열을 반환하는 이유가 있습니다. – tcooc

3

: 문자열을 복사

>>> a = 'foo' 
>>> b = '%s' % a 
>>> id(a), id(b) 
(140595444686784, 140595444726400) 
-1

두 가지 방법을 수행 중 위치 A = "A"B = A를 복사 또는 복제 할 수 있습니다 할 수는 B의 습관을 의미한다 a = 'a'b = a [:]로 끝나는 a가 변경되면 영향을 받으십시오.

2

방금 ​​일부 문자열 조작을 시작했고이 질문을 발견했습니다. 나는 아마도 OP와 같은 것을하려고 했었습니다. "평소와 같이". 이전 답변은 내 혼란을 해결하지 못했지만 그것에 대해 조금 생각한 후에 마침내 "얻었습니다".

만큼 a, b, c, de 같은 값을 가지고, 이들은 동일 위치에 참조. 메모리가 저장됩니다. 변수가 다른 값을 가지 자마자 다른 참조를 갖기 시작합니다.

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

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

print a, b, c, d, e 

e = a + 'something' 
a = 'goodbye' 
print map(id, [ a,b,c,d,e ]) 
print a, b, c, d, e 

인쇄 출력은 다음과 같습니다 :

[4538504992, 4538504992, 4538504992, 4538504992, 4538504992] 

hello hello hello hello hello 

[6113502048, 4538504992, 4538504992, 4538504992, 5570935808] 

goodbye hello hello hello hello something 
+0

동작에 대한 자세한 내용은이 게시물에서 설명합니다. https://stackoverflow.com/questions/2123925/when-does-python-allocate-new-memory-for-identical-strings – dlasalle

관련 문제