我试图从列表中获取一个元素并对此元素进行一些更改(这也是一个列表)。奇怪的是,更改应用于上一个列表。这是我的代码:
>>>sentences[0]
['<s>/<s>',
'I/PRP',
'need/VBP',
'to/TO',
'have/VB',
'dinner/NN',
'served/VBN',
'</s>/</s>']
>>>sentence = sentences[0]
>>>sentence.insert(0,startc); sentence.append(endc)
>>>sentences[0]
['<s>/<s>',
'<s>/<s>',
'I/PRP',
'need/VBP',
'to/TO',
'have/VB',
'dinner/NN',
'served/VBN',
'</s>/</s>'
'</s>/</s>']
就像我只有一个指向该元素的指针,而不是一个副本
答案 0 :(得分:2)
事实上,你确实得到了一个“指针”。列表(以及任何可变值类型!)在Python中作为引用传递。
您可以通过将列表传递给list()
对象构造函数或使用[:]
制作完整切片来制作列表的副本。
a = [1,2,3]
b = a
c = list(a)
d = a[:]
a[1] = 4 # changes the list referenced by both 'a' and 'b', but not 'c' or 'd'
答案 1 :(得分:2)
你说得对!在Python中,当您将列表作为参数传递给函数,或者将列表分配给另一个变量时,实际上是将指针传递给它。
这是出于效率原因;如果你每次执行上述某项操作时都单独复制了一个1000项目列表,那么该程序会消耗太多的内存和时间。
要在Python中解决此问题,您可以使用= originalList[:]
或= list(originalList)
复制一维列表:
sentence = sentences[0][:] # or sentence = list(sentences[0])
sentence.insert(0,startc)
sentence.append(endc)
print(sentence) # modified
print(sentences[0]) # not modified
如果您需要复制2D列表,请考虑使用list comprehension。