我正在尝试创建一个更新现场参数的函数(主要是为了好奇心):
def inplaceUpdate(f, inputs):
for i in inputs:
i = f(i)
我有三个输入:
x = 1
y = 2
z = 3
功能f
:
f = lambda i: i**2
我想运行以下代码:
inplaceUpdate(f, [x, y, z])
然后我希望x
,y
和z
的值能够在适当的位置进行更改。这可能吗?
x = 1
y = 4
z = 9
答案 0 :(得分:3)
在Python中,整数是不可变的。有一个关于主题的问题here。
您的想法是,您无法更改引用x
,y
和z
的值。这意味着,如果你这样做:
x = 2
y = 3
z = 4
some_func([x, y, z])
some_func
无法更改变量x
,y
和z
的值。
但是,列表是可变的,您可以这样做:
def some_func(l):
l[:] = [i*2 for i in l]
l = [2, 3, 4]
some_func(l)
print l # the array has changed
这确实会改变名单。这是因为操作l[:]=...
分配给列表的包含,而不是重新分配引用 - 这将是l=...
。
答案 1 :(得分:2)
似乎,你想要的是映射列表。那个
有漂亮的内置函数map
# Declare lambda somewhere
f = lambda i: i**2
# Map your inputs
input = [1, 2, 3]
result = map(f, input)
答案 2 :(得分:0)
您还可以使用列表推导来实现此目的。它比地图更加pythonic,但基本上是相同的。
input = [1, 2, 3]
ls = [x**2 for x in input]
答案 3 :(得分:-1)
没有办法使用丑陋的hackery来修改调用函数的变量值。如果您保存了对在[x,y,z]
中创建的可变列表的引用,则inplaceUpdate
函数可以对其进行修改。
使用丑陋的黑客来完成这项任务:
def inPlaceUpdate(inputs):
frame = sys._getframe(1)
for input in inputs:
i = f(input)
for k,v in frame.f_locals.iteritems():
if v == input:
frame.f_locals[k] = i
break
else:
for k,v in frame.f_globals.iteritems():
if v == input:
frame.f_globals[k] = i
break