我编写了一个应该将2D列表插入表中的函数。
这是代码:
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 :(得分: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)
答案 1 :(得分:0)
问题是你期望Python通过值传递,但Python总是引用。考虑这个SO帖子:Emulating pass-by-value...
您可以在前几行创建一个副本:
from copy import deepcopy
def print_database(seats_plan):
seats_plan_copy = deepcopy(seats_plan)