考虑以下代码:
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]
这种惯用方式是哪种方式?
谢谢!
答案 0 :(得分:4)
如果您对列表进行切片,则只修改副本,因此您要执行的操作无法以您想要的形式工作。
但您可以将可选的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 :(得分:0)
这将有效:
a = range(10)
a[:5] = [c**2 for c in a[:5]]
答案 2 :(得分:0)
a[:5]
创建一个新列表。因此,func1
适用的更改不会在a
中反映出来。您可以将切片添加到函数中:
def func1(a, start=None, stop=None, step=None):
start = start if start is not None else 0
stop = stop if stop is not None else len(a)
step = step if step is not None else 1
a[start:stop:step] = [x**2 for x in a[start:stop:step]]
func1(a, stop=5)