•
Одно из последствий такого поведения — объекты изменяемых типов не могут быть использованы как ключи для словаря, ведь если их значение изменится, то изменится и его хэш (словари используют хэширование[45] для хранения ключей). Неизменяемым эквивалентом списка является кортеж. Он создается добавлением круглых скобок, например (1, 2). Кортеж нельзя изменить на месте, поэтому его можно использовать как ключ словаря.
Правильное применение изменяемых типов для объектов, которые по задумке должны изменяться (например, my_list = [1, 2, 3]), и неизменяемых типов для объектов, которые по задумке должны иметь фиксированное значение (например, islington_phone = ("220", "7946", "0347")), поможет другим разработчикам понять код.
В Python строки неизменяемы и это может удивить новичков. Попытка изменить строку вызовет ошибку:
>>> s = "I'm not mutable"
>>> s[1:7] = " am"
Traceback (most recent call last):
File "
TypeError: 'str' object does not support item assignment
Это означает, что при создании строки по частям гораздо эффективнее собрать все части в список, поскольку его можно изменять, а затем объединить их. Кроме того, в Python предусмотрены
Плохой | Хороший | Лучший |
---|---|---|
>>> s = "" | >>> s = [] | >>> r = (97, 98, 99) |
>>> for c in (97, 98, 98): | >>> for c in (97, 98, 99): | >>> s = [unichr(c) for |
… ····s += unichr(c) | … ····s.append(unichr(c)) | ····c in r] |
… | … | >>> print("".join(s)) |
>>> print(s) | >>> print("".join(s)) | abc |
abc | abc |
На главной странице Python (https://www.python.org/doc/essays/list2str/) вы можете найти обсуждение подобной оптимизации.
Наконец, если количество элементов конкатенации известно, добавить строку будет проще (и очевиднее), чем создавать список элементов только для того, чтобы вызвать функцию "".join().
Все следующие варианты форматирования для определения переменной cheese делают одно и то же[46]:
>>> adj = "Red"
>>> noun = "Leicester"
>>>
>>> cheese = "%s %s" % (adj, noun) # Этот стиль устарел (PEP 3101)
>>> cheese = "{} {}".format(adj, noun) # Возможно начиная с Python 3.1
>>> cheese = "{0} {1}".format(adj, noun) # Числа можно использовать повторно
>>> cheese = "{adj} {noun}".format(adj=adj, noun=noun) # Этот стиль — лучший
>>> print(cheese)
Red Leicester
Зависимости, получаемые от третьей стороны
Пакет, который использует
Однако можно достичь консенсуса: почти во всех случаях лучше всего держать зависимости отдельно друг от друга, поскольку это добавляет ненужное содержимое (зачастую мегабайты дополнительного кода) в репозиторий. Виртуальные среды, использованные в сочетании с файлами setup.py (предпочтительно, особенно если пакет является библиотекой) или requirements.txt (при использовании переопределит зависимости в файле setup.py в случае конфликтов), могут ограничить зависимости набором рабочих версий.