如果对列表进行切片,则只能修改一个副本,因此您要执行的操作无法按照您想要的形式进行.
但是您可以将一个可选的slice对象传递给func1,如果不是None,则使用它来执行slice分配(否则使用[:])
我将执行以下操作(使用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]
>在第一种情况下,列表的整体已更改
>在第二种情况下,它仅更改了上半部分.
>在第三种情况下,它更改了下半部分,但是2中有1个值(步幅= 2)