切片是否创建新的唯一对象?与列表有关的两个看似矛盾的示例

时间:2019-06-13 22:28:58

标签: python slice python-3.7

我正在阅读一本关于Python的书,他们最初引入了列表切片,以创建列表的完整副本的方式,而不仅仅是参考。但是,在本书的后面提供了一个示例,其中他们更改了列表切片,并且先前实例化的列表也进行了更改,即如果仅复制引用,您将期望的行为类型。

在下面,我将为每件事提供两个简单的示例。

我已经仔细检查了切片是否返回了具有不同ID的新复制列表,而我发现的所有内容都表明它确实返回了唯一列表,而不仅仅是引用。


本书中引入了第一段代码,以将列表内容复制到新列表中。

exList = ['0', '1', '2', '3']

exCopy = exList[:]

我目前对此有所了解,因为分片运算符返回一个包含exList内容的新列表,然后将其分配给exCopy


下一个代码片段将更改列表切片的内容,这也将更改完整列表。根据我以前的理解,我认为对切片列表的更改不会改变列表本身,因为切片将代表其自己的唯一列表副本(同样不是引用,而是列表副本)。

aliens = []

for alien_Number in range(30):
    new_alien = {'color': 'green', 'points': 5, 'speed': 'slow'}
    aliens.append(new_alien)


for alien in aliens[:3]:
    if alien['color'] == 'green':
        alien['color'] = 'yellow'

for alien in aliens[:5]:
    print(alien)
print("...")

1 个答案:

答案 0 :(得分:1)

切片会创建一个副本。易于测试的示例:

def sumOfLeftLeaves(num):

    mytotal = 0

    def helper():
        nonlocal mytotal
        mytotal = mytotal + num

    helper()
    return mytotal

inum = 100
print(sumOfLeftLeaves(inum))

结果是:

a = [1,2,3]
b = a[:]
b[1] = 5
print('b',b)
print('a',a)