python - 即使没有在 for 循环中触及它,列表也会发生变化

标签 python list

所以我正在做代码出现的第 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。我什至在 for 循环中根本没有接触 ogroad,但它每次迭代都会给出不同的输出。

我使用的输入:

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

最佳答案

list() 仅创建平面副本。这意味着列表中的列表不会被复制,而是会被共享。 shell 中的示例:

>>> t=[[42]]
>>> t2 = list(t)
>>> t is t2
False
>>> t[0] is t2[0]
True
>>> t2[0][0] = 43
>>> t
[[43]]

关于python - 即使没有在 for 循环中触及它,列表也会发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53878024/

相关文章:

c - 将一个链表插入另一个链表

r - 我们又来了 : append an element to a list in R

python - 从 Python 接收 C++ 中的字符串

python - 覆盖 Python 中的特殊函数

Python 字典和列表比较

java - 对于 Java 中的静态帮助器类,使用泛型还是对象类型更好?

python - 计算两个列表中的相同对

c++ - 在列表中查找最常见的元素(C++ STL)?

python - GStreamer:将延迟/间隙/移位引入音频

Python:分割字符串,尊重括号