为什么我的硬币兑换(DP)功能中的变量会发生变化?

时间:2018-10-24 09:04:46

标签: python dynamic-programming coin-change

任务是编写一个函数,使用给定的硬币面额(硬币= [200、100、50、20、10、5、2、1]来改变一定数量的硬币)例如,[1,0,1,0,5,0,3,0]的口袋代表1x£2、1x£0.50、5x£0.10和3x£0.02。如果有几种付款方式,则应使用硬币使用最多的一种。如果无法支付确切的金额,则应支付最低的金额,并注明零钱。 输出应该以与口袋相同的格式列出要支付的硬币,第9个元素会发生变化。

问题:该函数当前将“口袋”更改为输出原始口袋减去已支付的金额,该金额接近所需的答案(它应说明应提供的硬币)。因此,在编辑它们之前,我创建了一个变量original_pocket来存储'pocket'的初始值,因此从那里开始,original_pocket和pocket之间的区别就是所需的输出。 考虑到for循环只能修改'pocket',我不明白为什么original_pocket会发生变化?

def pay_with_coins(amount, pocket):
    amount = amount*100 #puts amount in pennies
    original_pocket = pocket
    coins = [200, 100, 50, 20, 10, 5, 2, 1]
    def value(list):
        value = 0
        for i in range(8):
        value += list[i]*coins[i]
        return value
    pocket_val = value(pocket)
    if pocket_val < amount:
        return False
    else: pass
    for i in range(7,-1,-1):
        take = min(amount//coins[i], pocket[i])  #how many of each coin type can be taken
        amount = amount - coins[i]*take #set a new amount
        pocket[i]= pocket[i]-take#take those coins out of pocket
    print(pocket, "this is the pocket")
    print(original_pocket, "original pocket")
    output = [0 for i in range (9)]
    for i in range(7):
        output[i]= original_pocket[i]-pocket[i]
    print (output) #I still need to account for change as output[8]

当前,使用测试:

    pay_with_coins(0.05,[0,0,0,0,0,5,3,6])

输出为:

    [0.0, 0.0, 0.0, 0.0, 0.0, 5.0, 3.0, 1.0] this is the pocket
    [0.0, 0.0, 0.0, 0.0, 0.0, 5.0, 3.0, 1.0] original pocket
    [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0]

而预期/期望输出应为:

    [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 5.0, 0, 0]

1 个答案:

答案 0 :(得分:1)

这是因为original_pocket = pocket使original_pocket成为pocket引用,而不是副本。因此,pocketoriginal_pocket上的操作都会影响同一列表。

要获取列表的新副本,请使用:

original_pocket = pocket.copy()(Python 3.3 +)

original_pocket = pocket[:]

original_pocket = list(pocket)