Элегантный способ изменения списка переменных по ссылке в Python?

Предположим, что у меня есть функция f (), которая принимает список и возвращает мутацию этого списка. Если я хочу применить эту функцию к пяти переменным-членам в экземпляре моего класса (i), я могу сделать это:

for x in [ia, ib, ic, id, ie]: x[:] = f(x) 

1) Есть ли более элегантный способ? Я не хочу, чтобы f () изменял переданный список.

2) Если мои переменные содержат простое целое число (которое не будет работать с обозначением среза), есть ли способ? (f () также принимает и возвращает целое число в этом случае)

Другое решение, хотя оно, вероятно, не изящно:

 for x in ['a', 'b', 'c', 'd', 'e']: setattr(i, x, f(getattr(i, x))) 

Python не имеет доступа к ссылке. Лучшее, что вы можете сделать, это написать функцию, которая создает новый список и назначает результат функции исходному списку. Пример:

 def double_list(x): return [item * 2 for item in x] nums = [1, 2, 3, 4] nums = double_list(nums) # now [2, 4, 6, 8] 

Или еще лучше:

 nums = map(lambda x: x * 2, nums) 

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

Возможно, вы сможете взломать решение, но лучше всего сделать это обычным способом.

РЕДАКТИРОВАТЬ

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

В конечном счете, то, что вы хотите сделать, несовместимо с тем, как структурирован Python. У вас самый элегантный способ сделать это уже в случае, если ваши переменные являются списками, но это невозможно с числами.

Это связано с тем, что переменные не существуют в Python. Ссылки делают. Таким образом, ix не является списком, это ссылка на список . Аналогично, если он ссылается на число. Поэтому, если ix ссылается на y , то ix = z фактически не изменяет значение y , оно меняет местоположение в памяти, на которое указывает ix .

В большинстве случаев переменные рассматриваются как поля, которые содержат значение. Имя находится на коробке. В python значения являются фундаментальными, а «переменные» – это просто теги, которые зависают по определенному значению. Очень приятно, когда вы привыкнете к этому.

В случае списка вы можете использовать назначение среза, как вы уже делали. Это позволит всем ссылкам на список увидеть изменения, так как вы сами меняете объект списка. В случае числа нет способа сделать это, потому что числа являются неизменяемыми объектами в Python. Это имеет смысл. Пять – пять, и вы не можете сделать это, чтобы изменить его. Если вы знаете или можете определить имя атрибута, вы можете использовать setattr для его изменения, но это не изменит другие ссылки, которые могут уже существовать.

Как говорит Рейф Кеттлер, если вы можете быть более конкретным о том, что вы на самом деле хотите сделать, тогда мы можем придумать простой элегантный способ сделать это.