为什么函数结束时列表的值会发生变化?

时间:2015-10-27 20:53:24

标签: python

所以,我有一个这个功能:

def Undo_Action(expenses_list ,expenses_lists_que,current_position):
    '''
    Undo the last performed action
    Input:expenses_list - The current list of expenses
          expenses_lists_que - The list containing the instances of last lists
          current_possition- The posion in the que where our current expenses_list is
    '''
    if len(expenses_lists_que)>0:
        expenses_list=deepcopy(expenses_lists_que[current_position-1])
        current_position=current_position-1
    else:
        print("You din not performed any actions yet!")
    print ("Label 1:" ,expenses_list)
    return current_position

我在这个函数中调用它

def Execute_Main_Menu_Action( expenses_list, action, expenses_lists_que,current_position):
    '''
    Executes a selected option from the main menu
    Input: The expenses list on which the action will be performed
           The action which should be exectued
    Output: The expenses list with the modifications performed
    '''
    if action == 1 :
        Add_Expense(expenses_list)
    elif action== 5:
        Show_Expenses_List(expenses_list)
    elif action== 2:
        Remove_Expense_Menu( expenses_list)
    elif action== 3:
        Edit_Expense_Menu(expenses_list)
    elif action==4:
        Obtain_Data_Menu (expenses_list)
    elif action==6:
        current_position=Undo_Action(expenses_list ,expenses_lists_que,current_position)
    print("Label 2:" , expenses_list)

    return current_position

当函数Undo_Action结束时,为什么列表expense_list会丢失它的值。我的意思是当我在Label 1上打印expense_list时,会执行修改,但是当函数退出时,修改不会保留在标签2中,我有一个不同的列表。

1 个答案:

答案 0 :(得分:3)

这是因为expenses_list中的Undo_Action现在指的是expenses_list=deepcopy(expenses_lists_que[current_position-1])之后的另一个列表。

您需要做的是将该行更改为expenses_list[:]=deepcopy(expenses_lists_que[current_position-1])。在这种情况下,expenses_list将被修改,而不是引用另一个列表。

因此,如果在函数内部写expenses_list = [1,2],它将不会影响外部expenses_list,因为函数中的expenses_list现在引用另一个对象(列表)。但是,如果您撰写expenses_list[:] = [1,2]expenses_list[0], expenses_list[1] = 1, 2,您的外部expenses_list将会被更改。