Python 使列表独立于自身(?)
我正在试验列表,并试图显示以下代码段:Python 使列表独立于自身(?),python,list,Python,List,我正在试验列表,并试图显示以下代码段: ---------- ---hello-- ---------- 但要做到这一点,我需要让3'列表彼此独立。有办法做到这一点吗 ( 电流输出当然是: ---hello-- ---hello-- ---hello-- ) 使用list构造函数制作listsall listBig = [list(listSmall) for i in range(3)] 另一种等效方法(IMO可读性较差)是使用空切片: listBig = [listSmall[:] f
----------
---hello--
----------
但要做到这一点,我需要让3'列表彼此独立。有办法做到这一点吗
(
电流输出当然是:
---hello--
---hello--
---hello--
)
使用
list
构造函数制作listsall
listBig = [list(listSmall) for i in range(3)]
另一种等效方法(IMO可读性较差)是使用空切片:
listBig = [listSmall[:] for i in range(3)]
当您将
listBig
放入listBig时,您想复制一份listmall
。您可以使用列表
功能执行此操作:
listBig = [list(listSmall), list(listSmall), list(listSmall)]
这是因为list
是可变的
listBig = [listSmall, listSmall, listSmall]
使listBig
指向同一可变列表三次,因此当您通过其中一个引用更改此可变列表时,您将通过所有三个引用看到此更改
您应该列出三个不同的列表:
listBig = [ ['-'] * 10 for _ in range(3)]
根本不需要listmall
整个代码:
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))
第一个和最后一个列表仍然可以共享。更节省内存的实现是
listBig = [listSmall, listSmall[:], listSmall]
请注意,第二个使用切片表示法来创建整个listSmall
列表的副本。或者,listSmall[:]
@Volatility知道我还必须添加三个与问题无关的助手:wordPosX+=1
和用于listBig:print.中的v。加入(v)
和listBig[wordPosy][3:3+len(word)]=word
您的第一行是“这是因为列表是可变的”。这与将listBig指向同一个列表三次有什么关系?@Utkarshssinha我添加了一些解释。有什么问题吗?写[obj,obj,obj]
将使列表指向同一对象三次,无论obj
是否可变。只是如果obj
是不可变的,您可能不会注意到同一对象的三个副本与三个不同对象之间的差异。如果对象是可变的,您可以对其进行变异,然后您就会看到这一点您可以对所有三个列表项(如果它们都指向同一个对象)进行变异,而不是只对一个列表项进行变异(如果您创建了三个单独的对象)。@BrenBarn好的,但这就是我在回答中所说的。您永远不会注意到与ummutable对象的区别(这就是为什么['-']*10
是安全的),除非您检查对象的标识,这很好。@digitalfarmer很抱歉我写得很混乱。它不是3:3。它实际上是listBig[wordPosY][3:(3+len(word))]
listBig = [listSmall, listSmall[:], listSmall]