2015-10-27 28 views
0

所以,我有一个这样的功能:为什么函数结束时列表的值会发生变化?

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 

为什么列表expenses_list失去了它的价值,当函数Undo_Action结束。我的意思是,当我在标签1上打印费用表时,将执行修改,但是当函数退出时,修改不会保留在标签2上,所以我有一个不同的列表。

回答

3

这是因为现在expenses_listUndo_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将被更改。

相关问题