2014-11-15 73 views
-2

我寫了一個函數,該函數應該將2D列表插入表中。將obj插入列表中一次

這是代碼:

seats_plan = [[True, True, True, True, True], [True, True, True, True, True], [True, True, True, True, True], [True, True, True, True, True], [True, True, True, True, True]] 
def print_database(seats_plan): 
    for row in seats_plan: 
     row.insert(0, seats_plan.index(row)) 
    seats_plan.insert(0, [' ', '0', '1', '2', '3', '4']) 
    for k in seats_plan: 
     for char in k: 
      if char is True: 
       print '.', 
      elif char is False: 
       print 'x', 
      else: 
       print char, 
     print 

,輸出是:

0 1 2 3 4 
0 . . . . . 
1 . . . . . 
2 . . . . . 
3 . . . . . 
4 . . . . . 

,但它也改變seats_plan,所以如果我再次調用該函數再次插入數字。 如何在不更改原來的seats_plan的情況下只插入一次?

+0

您應該創建一個副本* *列表和修改,而不是原來的。 – jonrsharpe

+0

你想要一個函數在第一次被調用時將事物插入表中,但不是第二次? –

回答

0

問題是你期待Python傳遞值,但Python總是引用。考慮這個SO職位:Emulating pass-by-value...

你可以在你的第一個幾行創建一個副本:

from copy import deepcopy 
def print_database(seats_plan): 
    seats_plan_copy = deepcopy(seats_plan) 
+2

爲了清楚起見,Python傳遞了引用,它與「通過引用傳遞」不同,後者允許函數在調用者的名稱空間中重新分配名稱。 –

+0

@NedBatchelder,我編輯了你所描述的答案。 –

1

不要更改列表,因爲它僅僅是一個參考,例如與原始列表相同。打印的數字,在需要的時候:

seats_plan = [[True, True, True, True, True], [True, True, True, True, True], [True, True, True, True, True], [True, True, True, True, True], [True, True, True, True, True]] 
def print_database(seats_plan): 
    print ' ', '0', '1', '2', '3', '4' 
    for row, seats in enumerate(seats_plan): 
     print row, 
     for seat in seats: 
      print '.' if seat else 'x', 
     print 

或列表理解

def print_database(seats_plan): 
    plan = [ '%d %s' % (row, ' '.join('.' if seat else 'x' for seat in seats)) 
     for row, seats in enumerate(seats_plan)] 
    plan.insert(0, ' ' + ' '.join(str(c) for c in range(len(seats)))) 
    print '\n'.join(plan)