Почему переменная в моей функции изменения монет (DP) меняется? - PullRequest
0 голосов
/ 24 октября 2018

Задача состоит в том, чтобы написать функцию для внесения изменений в сумму с использованием данного номинала монет (монеты = [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 является желаемым результатом.Я не могу понять, почему original_pocket меняется, учитывая, что цикл for должен изменять только «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 голосов
/ 24 октября 2018

Это потому, что original_pocket = pocket делает original_pocket ссылкой на pocket, а не копией.Поэтому операции как pocket, так и original_pocket влияют на один и тот же список.

Чтобы получить новую копию списка, используйте:

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

или

original_pocket = pocket[:]

или

original_pocket = list(pocket)

...