Python:用于更改“就地”值的函数?

时间:2014-03-11 23:13:24

标签: python function

我希望实现一个函数,允许其参数的值重新分配到位[']。

作为一个例子,一个函数将增加参数 x 并减少参数 y 。 (这只是一个简单的例子 - 动机是 X Y 实际上是大型数据帧的单个元素;它们的表达方式很笨拙;而且这个操作将会经历了多次迭代。)

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

理想情况下,这将运行:

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

发现这些值现在是 X = 7且 Y = 5.但当然它不会那样工作 - 我想知道为什么?< / p>

1 个答案:

答案 0 :(得分: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的值而不是参考。 我建议你使用第一个解决方案。 我希望这会有所帮助。