任务是编写一个函数,使用给定的硬币面额(硬币= [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]
答案 0 :(得分:1)
这是因为original_pocket = pocket
使original_pocket
成为pocket
的引用,而不是副本。因此,pocket
和original_pocket
上的操作都会影响同一列表。
要获取列表的新副本,请使用:
original_pocket = pocket.copy()
(Python 3.3 +)
或
original_pocket = pocket[:]
或
original_pocket = list(pocket)