1

Я новичок в Python и объектно ориентировать программирования, и есть очень простой вопрос: 101методы Python: изменить оригинальную против возвращения другого объекта

я вижу некоторые методы возвращают измененный объект и сохранить оригинал:

In: x="hello" 
In: x.upper() 
Out: 'HELLO' 
In: x 
Out: 'hello' 

Я вижу другие способы изменения и перезаписать исходный объект:

In: y=[1,2,3] 
In: y.pop(0) 
Out: 1 
In: y 
Out: [2, 3] 

ли либо из них норма? Есть ли способ узнать, к какому случаю я отношусь к данному классу и методу?

+2

Методы изменчивых объектов не «перезаписывают» исходный объект - они мутируют их. Оба изменяемых и неизменяемых объекта являются центральными для Python. Любое базовое введение в Python должно объяснить разницу. Переполнение стека не предназначено для воспроизведения информации, которая легко доступна в других местах. –

+1

Чтобы узнать, что происходит с конкретным классом/методом, просто посмотреть на документы - это хороший способ узнать. Они используются в разных ситуациях. – qxz

+1

См. [Неизменяемые vs Mutable types] (http://stackoverflow.com/questions/8056130/immutable-vs-mutable-types) и ссылки на официальные документы Python. –

ответ

3

Ваши примеры показывают разницу между неизменяемыми встроенными объектами (например, строками и кортежами) и изменяемыми объектами (например, списками, dicts и наборами).

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

2

Оба они являются идиоматическими в Python, хотя list.pop() - это немного особый случай.

В общем, методы в Python либо мутировать объект или возвращает значение. list.pop() является немного необычным в том, что по определению он должен делать то же: удалить элемент из списка и вернуть его вам.

Что не является распространенным явлением в Python, хотя в других языках, чтобы мутировать объект, а затем возвращать тот же объект - который позволил бы методы должны быть соединены друг с другом, как так:

shape.stretch(x=2).move(3, 5) 

. .. но может вызвать сложность отладки программ.

Если объект неизменен, как строка, вы можете быть уверены, что метод не будет мутировать его (потому что по определению он не может). В противном случае единственный способ определить, является ли метод мутацией его объекта, - это прочитать документацию (обычно отлично подходит для встроенных и стандартных объектов библиотеки Python) или, конечно же, источник.

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