3

我正在试验列表,并试图显示以下代码段:

----------
---hello--
----------

但要做到这一点,我需要让 3 个“listSmall”彼此独立。有没有办法做到这一点?

(

当前输出当然是:

---hello--
---hello--
---hello--

)

listSmall = ['-','-','-','-','-','-','-','-','-','-',]
listBig = [listSmall, listSmall, listSmall]
word = 'hello'
wordPosX = 3
wordPosY = 2

for i in word:
    listBig[wordPosY][wordPosX] = i
    wordPosX = wordPosX + 1

i = 0
while i != 3:
    print ''.join(listBig[i])
    i = i + 1
4

4 回答 4

5

这是因为list是可变的。

listBig = [listSmall, listSmall, listSmall]

listBig指向同一个可变列表三次,因此当您通过这些引用中的一个更改此可变列表时,您将在所有三个引用中看到此更改。

您应该列出三个不同的列表:

listBig = [ ['-'] * 10 for _ in range(3)] 

根本不需要listSmall

整个代码:

listBig = [ ['-'] * 10 for _ in range(3)] 
word = 'hello'
wordPosX, wordPosY = 3, 1
listBig[wordPosY][3: (3+len(word))] = word
for v in listBig:
    print(''.join(v))
于 2013-04-28T05:32:11.617 回答
3

使用list构造函数进行浅拷贝listSmall

listBig = [list(listSmall) for i in range(3)]

另一种等效(可读性较差的 IMO)方式是使用空切片:

listBig = [listSmall[:] for i in range(3)]
于 2013-04-28T05:29:56.070 回答
1

listSmall当你把它放进去时,你想复制一份listBig。您可以使用以下list功能做到这一点:

listBig = [list(listSmall), list(listSmall), list(listSmall)]
于 2013-04-28T05:30:24.730 回答
0

第一个和最后一个列表仍然可以共享。更节省内存的实现是

listBig = [listSmall, listSmall[:], listSmall]

请注意,第二个使用切片表示法来创建整个listSmall列表的副本。

于 2013-04-28T06:16:51.930 回答