Если вы отрезаете список, вы изменяете только копию, так что вы хотите сделать, не работает в форме вы хотите.
Но вы могли бы пройти дополнительный slice
объект func1
, и если это не None
, использовать его для выполнения задания среза (иначе использовать [:]
)
Я хотел бы сделать следующее (используется lambda
, чтобы избежать копирования/вставки формулы и выражения генератора, чтобы не создавать бесполезное временный список:
def func1(a,the_slice=None):
e = lambda y : (x**2 for x in y)
if the_slice:
a[the_slice] = e(a[the_slice])
else:
a[:] = e(a)
испытания:
a = list(range(10))
func1(a)
print(a)
a = list(range(10))
func1(a,slice(5)) # stop at 5
print(a)
a = list(range(10))
func1(a,slice(5,len(a),2)) # start at 5/stop at the end, stride/step 2
print(a)
результат:
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
[0, 1, 4, 9, 16, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 25, 6, 49, 8, 81]
- в первом случае, совокупность списка был изменен
- во втором случае, он только изменил первую половину.
- в третьем случае, она изменила вторую половину, но 1 значение из 2 (шаг = 2)
Вы также можете проверить это http://stackoverflow.com/questions/22054698/python-modifying -list-inside-a-function – Kasramvd
@ Kasramvd Поскольку у другого вопроса нет разреза, я не считаю, что это дубликаты. Спасибо за ссылку в любом случае ... – omerbp
Это тривиальное различие, но главная проблема заключается в том, что изменение изменчивого объекта внутри функции может отражать вызывающего. – Kasramvd