2010-08-12 9 views
1

в Lists -Ь = а против Ь = а [:] в строках | списки

Я всегда могу проверить, что b=a указывает на тот же объект и c=a[:] создает еще одну копию.

>>> a = [1,2,3,4,5] 
>>> b = a 
>>> c = a[:] 
>>> a[0] = 10 
>>> b 
[10, 2, 3, 4, 5] 
>>> c 
[1, 2, 3, 4, 5] 

В Strings -

Я не могу внести изменения в исходной неизменного строке. Как я могу подтвердить, что b=a делает b указывает на тот же объект, а c = a[:] создает новую копию строки?

+1

Что вы пытаетесь выполнить, для чего требуется эта функция? Если вы не можете вносить изменения в строки, имеет ли значение, что вы всегда используете одну и ту же копию? –

ответ

2

Вы можете использовать оператор is.

a = 'aaaaa' 
b = 'bbbbb' 

print a is b 
a = b 
print a is b 

c = a[:] 
print c is a 

Это работает, потому что a is b тогда и только тогда, когда id(a) == id(b). В CPython, по крайней мере, id(foo) - это только адрес памяти, в котором хранится foo. Следовательно, если foo is bar, то foo и bar являются буквально одним и тем же объектом. Интересно отметить, что

a = 'aaaaa' 
b = 'aaaaa' 
a is b 

является True. Это происходит из-за того, что python ставит (по крайней мере, большинство) строки, чтобы он не терял память, сохраняя одну и ту же строку дважды и, что более важно, мог сравнивать строки путем сравнения указателей фиксированной длины в реализации C вместо сравнения байтов строк по байтам.

+0

'print c is a' дает мне 'True' (ожидал' False': 'c' является копией' a', хранящейся в другом месте, поэтому 'c' и' a' не должны быть одинаковыми объектами). –

+0

@Vaibhav Bajpai python интернирует 'a [:]'. Поскольку это одна и та же строка, нет смысла хранить две копии. – aaronasterling

+0

@Vaibhav Bajpai 'a = [1, 2, 3]; b = a [:] 'создает мелкую копию' a', потому что списки изменяемы, поэтому необходимо отслеживать изменения, которые могут быть сделаны на 'b'. строки не изменяются. – aaronasterling

1

По-прежнему можно хранить одну и ту же строку в нескольких местах - см. Этот пример.

>>> a="aaaaa" 
>>> b=a[:] 
>>> b is a 
True 
>>> b=a[:-1]+a[-1] 
>>> b is a 
False 
>>> b==a 
True 
>>> 
+0

Приятно это знать. Я часто задумывался о том, что всегда проверяю строки с 'is'. Вы знаете, почему python делает это в этом случае? – aaronasterling

+0

@aaronasterling, строковые литералы всегда должны быть в безопасности. Кажется, что построенные строки не проверялись. Я не знаю, почему это так. –

+0

Определенно * не * безопасно предположить, что идентичные строковые литералы хранятся как одна и та же строка. В этом случае Python не дает никаких гарантий. Текущие реализации CPython позволяют оптимизировать строковые литералы в одном модуле компиляции, а строковые литералы, которые выглядят как идентификаторы, интернированы, но это как раз детализация реализации. – Duncan

Смежные вопросы