gpt4 book ai didi

python在函数中修改列表的切片

转载 作者:太空宇宙 更新时间:2023-11-03 14:56:15 25 4
gpt4 key购买 nike

考虑以下代码:

def func1(a):
a[:] = [x**2 for x in a]

a = range(10)
print a #prints [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
func1(a[:5])
print a #also prints [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

我希望发送列表的一部分 a 并在函数内更改它。我的预期输出是

[0, 1, 4, 9, 16, 5, 6, 7, 8, 9]

哪种方式是惯用的方式?

谢谢!

最佳答案

如果对列表进行切片,则只会修改一个副本,因此您想要执行的操作不会以您想要的形式工作。

但是您可以将可选的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]
  • 在第一种情况下,列表的整体发生了变化
  • 第二种情况,只改变了前半部分。
  • 在第三种情况下,它改变了后半部分,但是 2 取 1 的值(stride=2)

关于python在函数中修改列表的切片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42346288/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com