Использование tuple
является наиболее распространенным способом сделать это, как объяснено в других ответах.Предполагая, что вы начинаете с экземпляра list
, другие возможные стратегии включают в себя:
- , если роль списка в функции просто повторяется, передайте итератор, а не сам список -
iterator = iter(my_list)
.Обратите внимание, что вы можете зацикливаться на итераторе только один раз;если вам нужно сделать цикл более одного раза, вы можете передать генератор, который многократно дает iter(my_list)
. - передать копию списка вместо самого списка:
new_list = my_list.copy()
или new_list = my_list[:]
.Это может быть не очень хорошей стратегией для очень больших списков из-за потребления памяти.
Какой бы метод вы ни выбрали - даже кортежи - помните, что все эти подходы предполагают, что элементы в коллекции сами по себе являются неизменяемымиНапример, целые числа и строки.Если элементы являются изменяемыми, они могут быть видоизменены (но не заменены):
>>> t = ([1], [1,2])
>>> t[0] = 6
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> t[0][0] = 6
>>> t
([6], [1, 2])
>>> L = [[1], [1, 2]]
>>> for x in iter(L):
... x[0] += 1
...
>>> L
[[2], [2, 2]]
>>> L = [[1], [1, 2]]
>>> copy = L.copy()
>>> for x in copy:
... x[0] += 1
...
>>> L
[[2], [2, 2]]
>>>
>>> copy[0] = 42
>>> copy
[42, [2, 2]]
>>> L
[[2], [2, 2]]
Вы можете обойти это, используя copy.deepcopy , но опять же с затратами в памяти.