Python inplace更新函数参数?

时间:2015-11-26 13:29:01

标签: python

我正在尝试创建一个更新现场参数的函数(主要是为了好奇心):

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])

然后我希望xyz的值能够在适当的位置进行更改。这可能吗?

x = 1
y = 4
z = 9

4 个答案:

答案 0 :(得分:3)

在Python中,整数是不可变的。有一个关于主题的问题here

您的想法是,您无法更改引用xyz的值。这意味着,如果你这样做:

x = 2
y = 3
z = 4
some_func([x, y, z])

some_func 无法更改变量xyz的值。

但是,列表是可变的,您可以这样做:

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