Подтвердить что ты не робот

Как я могу скопировать строку Python?

Я делаю это:

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?

4b9b3361

Ответ 1

Вам не нужно копировать строку Python. Они неизменяемы, и модуль copy всегда возвращает оригинал в таких случаях, как str(), весь фрагмент строки и конкатенацию пустой строкой.

Кроме того, ваша строка 'hello' интернирована (некоторые строки). Python преднамеренно пытается сохранить только одну копию, поскольку это ускоряет поиск в словаре.

Один из способов, которыми вы могли бы обойти это, - это создать новую строку, а затем отрезать эту строку до исходного содержимого:

>>> 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() для получения фактического объема памяти или для оценки максимального объема, если объекты не кэшируются и не используются повторно.

Ответ 2

Вы можете скопировать строку в python с помощью форматирования строки:

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

Ответ 3

Я только начинаю несколько строковых манипуляций и нашел этот вопрос. Я, вероятно, пытался сделать что-то вроде OP, "обычный меня". Предыдущие ответы не прояснили мое замешательство, но, немного подумав об этом, я, наконец, "получил".

Пока a, b, c, d и e имеют одинаковое значение, они ссылаются на одно и то же место. Память сохраняется. Как только переменная начинает иметь разные значения, они начинают иметь разные ссылки. Мой опыт обучения исходил из этого кода:

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

Ответ 4

Иначе говоря, "id()" не то, о чем вы заботитесь. Вы хотите знать, можно ли изменить имя переменной без ущерба для имени переменной источника.

>>> a = 'hello'                                                                                                                                                                                                                                                                                        
>>> b = a[:]                                                                                                                                                                                                                                                                                           
>>> c = a                                                                                                                                                                                                                                                                                              
>>> b += ' world'                                                                                                                                                                                                                                                                                      
>>> c += ', bye'                                                                                                                                                                                                                                                                                       
>>> a                                                                                                                                                                                                                                                                                                  
'hello'                                                                                                                                                                                                                                                                                                
>>> b                                                                                                                                                                                                                                                                                                  
'hello world'                                                                                                                                                                                                                                                                                          
>>> c                                                                                                                                                                                                                                                                                                  
'hello, bye'                                                                                                                                                                                                                                                                                           

Если вы привыкли к C, то они похожи на переменные указателя, за исключением того, что вы не можете их ссылаться, чтобы изменить то, на что они указывают, но id() сообщит вам, где они сейчас указывают.

Проблема для программистов на Python возникает, когда вы рассматриваете более глубокие структуры, такие как списки или dicts:

>>> o={'a': 10}                                                                                                                                                                                                                                                                                        
>>> x=o                                                                                                                                                                                                                                                                                                
>>> y=o.copy()                                                                                                                                                                                                                                                                                         
>>> x['a'] = 20                                                                                                                                                                                                                                                                                        
>>> y['a'] = 30                                                                                                                                                                                                                                                                                        
>>> o                                                                                                                                                                                                                                                                                                  
{'a': 20}                                                                                                                                                                                                                                                                                              
>>> x                                                                                                                                                                                                                                                                                                  
{'a': 20}                                                                                                                                                                                                                                                                                              
>>> y                                                                                                                                                                                                                                                                                                  
{'a': 30}                                                                                                                                                                                                                                                                                              

Здесь o и x относятся к одному и тому же dict o ['a'] и x ['a'], и этот dict является "изменчивым" в том смысле, что вы можете изменить значение для ключа "a". Поэтому "y" должен быть копией, а y ['a'] может ссылаться на что-то еще.

Ответ 5

Копирование строки может быть выполнено двумя способами: либо скопировать местоположение a = "a" b = a, либо вы можете клонировать, что означает, что b не будет затронуто при изменении, которое выполняется a = 'a' b = a [:]