【问题标题】:Python: functions to change values 'in place'?Python:“就地”改变值的函数?
【发布时间】:2014-03-11 23:13:24
【问题描述】:

我想实现一个函数,允许“就地”重新分配其参数的值。

例如,一个函数将增加参数 x 和减少参数 y。 (这只是一个简单的说明示例 - 动机是 XY 实际上是大型数据帧的单个元素;它们的表达式很笨拙;并且此操作将经历多次迭代。)

def incdec(x,y,d):
    x += d
    y -= d

理想情况下,这将运行为:

X = 5; Y = 7; d = 2
incdec(X,Y,d)

发现现在的值是 X = 7 和 Y = 5。但它当然不会那样工作 - 我想知道为什么?

【问题讨论】:

  • 你不能在函数中重新绑定这些变量,不。
  • 这对于您给定的示例是不可能的,因为函数无法重新绑定传递给它的变量。当然,您仍然可以更改传递给您的函数的任何对象内部的引用,因此如果您更详细地描述它,可能会为您的实际用例解决一些问题。
  • 如果你有,比如说,列表作为输入,这应该可以工作(即def incedec(x,y,d): x[0] += d; x[0] += d; where X=[5]; Y=[7]。这都是关于可变和不可变数据类型的。
  • 您尝试实施的方法至少有两种解决方法;写了一个简短的要点作为答案:gist.github.com/miku/9497430
  • 如果你真的有一个数据框或 numpy 数组,是的。正如你向他们展示的那样,不。如果您可以将您的问题更新为 numpy,那将有所帮助。

标签: python function


【解决方案1】:

为什么你的函数不改变 X 和 Y 的最终值?

在 Python 中,当调用带有参数的函数时, 参数值的副本存储在局部变量中。 确实当你写

def incdec(x,y,d):
    x += d
    y -= d

唯一改变的是函数 indec 中的 x 和 y。 但在函数结束时,局部变量会丢失。 要获得你想要的,你应该记住函数做了什么。 要在函数之后记住这些值,您应该像这样重新分配 x 和 y:

def incdec(x,y,d):
    x += d
    y -= d
    return (x,y)

# and then 

X = 5; Y = 7; d = 2
X,Y = incdec(X,Y,d)

这是因为 X,Y 是 int 类型。 您还可以使用列表直接访问要更改的变量。

def incdec(list_1,d):
    list_1[0] += d
    list_1[1] -= d
    #no return needed

# and then 
X = 5; Y = 7; d = 2
new_list = [X, Y]
incdec(new_list,d) #the list has changed but not X and Y

不要误会,传递的参数仍然是我之前所说的副本,但是当您复制列表时,只会复制引用,但它们仍然在查看同一个对象。这是一个演示:

number = 5
list_a = [number] #we copy the value of number
print (list_a[0]) # output is 5
list_b = list_a # we copy all references os list_a into list_b
print(list_b[0]) # output is 5
list_a[0]=99
print(list_b[0]) # output is 99
print(number)    # output is 5

如您所见,list_a[0] and list_b[0] 是同一个对象,但数字是不同的 那是因为我们复制了number 的值而不是引用。 我建议您使用第一个解决方案。 我希望这会有所帮助。

【讨论】:

猜你喜欢
  • 2011-07-16
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
  • 2019-02-20
  • 1970-01-01
  • 1970-01-01
  • 2019-07-05
  • 2023-04-02
相关资源
最近更新 更多