2013-09-21 2 views
2

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

Каково общепринятое в отрасли отношение к этому при передаче в изменяемых типах?

Например, со списком вы можете использовать:

def func(myList): 
    myList = myList[:] 

И после этого внутри этой функции myList будет копией, что это безопасно мутировать. То же самое с использованием модуля copy. Но это лучший или стандартный способ сделать это?

Или все просто переназначают все аргументы локальным переменным области до того, как они сделают что-нибудь еще? Вид раздражающего дополнительного шага, изменяющего имена аргументов ...

+0

Контроль доступа на полях объектов, если есть такая вещь, и документация методов. – clwhisk

ответ

4

Сделайте копию, если вам нужна копия, в противном случае ничего не делать , Вам не нужно рефлексивно делать копии каждого аргумента. Когда вы пишете функцию, подумайте о том, какие вещи будут переданы, подумайте, нужно ли вам мутировать эти вещи. Если вы это сделаете, и вы не хотите изменять их извне, то делайте копии. Невозможно передать в изменяемые объекты, которые вы do хотите мутировать.

Другими словами, не следует искать какой-либо шаблон целиком, который нужно поставить в начале каждой функции. Просто подумайте о том, что нужно делать каждой функции.

0

Обычно я использую list(), потому что это займет какое-то итеративное.

def func(iterable): 
    myList = list(iterable) 

Теперь вы можете вызвать FUNC с func(zip(x, y)) и не придется беспокоиться о zip не возвращает список в Python 3.

+0

На мой взгляд, это решение применимо только в некоторых сценариях (где параметр итерируется) и не очень интуитивно понятен --- – Aerovistae

+0

@Aerovistae: Как он менее интуитивен, чем 'arg [:]'? – BrenBarn

+0

@Aerovistae 'list (x)' будет делать то же, что и 'x [:]', когда 'x' - это список, поэтому он всегда применим, если' [:] 'is. – flornquake

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