Список изменений, даже не касаясь его в течение цикла - PullRequest
0 голосов
/ 21 декабря 2018

Итак, я делаю 13-й день появления кода, столкнулся с этой проблемой и, похоже, не могу понять, что происходит.

Вот мой код:

road = open('day13t.txt').read().strip().split('\n')

ogroad = [ list(x) for x in road ]
for i,r in enumerate(ogroad):
    for j,c in enumerate(r):
        if c == '>' or c == '<':
            ogroad[i][j] = '-'
        if c == '^' or c == 'v':
            ogroad[i][j] = '|'

rdict = {'-':'>', '\\':'v', '/':'^'}
ddict = {'|':'v', '\\':'>', '/':'<'}
ldict = {'-':'<', '\\':'^', '/':'v'}
udict = {'|':'^', '\\':'<', '/':'>'}

test = [ list(x) for x in road ]
nroad = [ list(x) for x in road ]
for i in range(3):
    for i, l in enumerate(test):
        for j, c in enumerate(l):
            if c == '>':
                ns = ogroad[i][j+1]
                nroad[i][j+1] = rdict[ns]

            if c == '<':
                ns = ogroad[i][j-1]
                nroad[i][j-1] = ldict[ns]

            if c == 'v':
                ns = ogroad[i+1][j]
                nroad[i+1][j] = ddict[ns]

            if c == '^':
                ns = ogroad[i-1][j]
                nroad[i-1][j] = udict[ns]

    test = list(nroad)
    nroad = list(ogroad)
    xroad = [ ''.join(x) for x in ogroad ]
    for l in xroad:
        print(l)

Итак, этисписки, кажется, обрели собственную жизнь, потому что в последних нескольких строках цикла for я распечатываю содержимое xroad, которое в основном является ogroad.И я даже не касаюсь ogroad в циклах for, но он выдает различный вывод на каждой итерации.

Ввод, который я использую:

/->-\        
|   |  /----\
| /-+--+-\  |
| | |  | v  |
\-+-/  \-|--/
  \------/ 

1 Ответ

0 голосов
/ 21 декабря 2018

list() создает только плоскую копию.Это означает, что списки в списке не копируются, а делятся.Пример в оболочке:

>>> t=[[42]]
>>> t2 = list(t)
>>> t is t2
False
>>> t[0] is t2[0]
True
>>> t2[0][0] = 43
>>> t
[[43]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...