Базовый питон. Как запретить функциям изменять список? - PullRequest
2 голосов
/ 30 января 2011
>>> def test():
...    a.remove(1)
>>> a = [1,2]
>>> test()
>>> print a 
[2]

Почему a равно [2], а не [1,2]?

Ответы [ 4 ]

6 голосов
/ 30 января 2011

Список изменчив.Если вы передадите его функции, и функция изменит ее, она останется неизменной.

  • Используйте неизменную структуру: tuple: a = (1,2)
  • Передайте копию исходного списка:b = list(a); b.remove(1) - теперь a и b имеют разное содержимое, a не изменилось.

Кроме того, старайтесь не использовать изменяемые глобальные данные.Либо передайте a в функцию, либо укажите a в качестве атрибута объекта и функцию в качестве его метода.

2 голосов
/ 30 января 2011

Непонятно, что вы хотите. Ваша функция test () изменяет глобальный список «a», поэтому неудивительно, что «a» изменяется.

Если вы хотите, чтобы функция «test» работала с копией, а не непосредственно с, вы можете сначала скопировать ее.

Например,

def test():
    a2 = list(a)
    a2.remove(1)
0 голосов
/ 30 января 2011

Поскольку список a существует в глобальном пространстве имен, и когда вы вызываете remove для него, значение 1 удаляется.

Если вы не хотите, чтобы он был изменен,просто создайте новый список.Если вы вызовете remove в списке a, то, конечно, будет удалено значение.

0 голосов
/ 30 января 2011

Списки являются изменяемыми объектами, они должны быть изменены. Если вы хотите запретить изменения, преобразуйте их в кортеж (например, a = (1, 2)). Кортежи являются неизменяемыми, поэтому их невозможно изменить без копирования и переназначения переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...