为什么我使用list作为函数的参数,函数不能改变实际参数的值而只改变形式参数?

时间:2016-08-26 22:40:58

标签: python function python-3.x

与我提出的这个问题类似的问题(访问How can python function actually change the parameter rather than the formal parameter?),只有这次我使用list作为形式参数。那么因为列表是引用类型?它应该像以前一样工作。 所以这是我的代码:

def twomerger(lx, ly):
    if lx[0] == ly[0]:
        lx[0] = ly[0]
        ly[0] = 0
    if lx[1] == ly[1]:
        lx[1] = ly[1]
        ly[1] = 0
    if lx[2] == ly[2]:
        lx[2] = ly[2]
        ly[2] = 0
    if lx[3] == ly[3]:
        lx[3] = ly[3]
        ly[3] = 0


row1 = [0, 2, 4, 4]
row2 = [2, 2, 4, 4]
twomerger(row1, row2)
print (row1)
print (row2)
print ("it's a new situation:")
print (row1)
print (row2)

这里我尝试将[0,2,4,4]和[2,2,4,4]转换为[0,4,8,8]和[2,0,0,0]。 (使相同的垂直数加起来)。我将两个列表 - row1和row2传递给我的函数twomerger的参数。我想因为row1和row2是list,它们是引用所以这个函数应该能够改变row1和row2。但是它会给我结果[0, 2, 4, 4][2, 2, 4, 4],这意味着该功能无法正常工作。所以我又困惑了。

1 个答案:

答案 0 :(得分:3)

我认为您的问题是您应该添加列表中的值,而是重新分配。将=更改为+=

def twomerger(lx, ly):
    if lx[0] == ly[0]:
        lx[0] += ly[0]
        ly[0] = 0
    if lx[1] == ly[1]:
        lx[1] += ly[1]
        ly[1] = 0
    if lx[2] == ly[2]:
        lx[2] += ly[2]
        ly[2] = 0
    if lx[3] == ly[3]:
        lx[3] += ly[3]
        ly[3] = 0

row1 = [0, 2, 4, 4]
row2 = [2, 2, 4, 4]
twomerger(row1, row2)
print (row1)
print (row2)

<强>输出

[0, 4, 8, 8]
[2, 0, 0, 0]

对于它的价值,你的方法可以写得更简洁:

def twomerger(lx, ly):
    for i, num in enumerate(lx):
        if lx[i] == ly[i]:
            lx[i] += ly[i]
            ly[i] = 0

或者如果您对zip感到满意:

def twomerger(lx, ly):
    for i, (a, b) in enumerate(zip(lx, ly)):
        if a == b:
            lx[i] += b
            ly[i] = 0