通过赋值函数更改函数中列表的值

2024-04-28 16:21:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道,在python中,当我们将一个列表传递给函数时,实际上是将一个对象引用传递给该列表。由于列表是可变的,因此在函数中应用任何列表操作实际上都会导致我们传入的列表发生更改

示例:

def change_list(some_list):
    some_list.remove('old list')
    some_list.append('new list')

sample = ['old list']
print(sample) # prints ['old list']
change_list(sample) # print ['new list']

当然,如果我们只是传递一个列表的副本,那么在调用change_list(sample[:])之后就没有变化了

下面是另一个不会导致列表更改的场景:

def change_list(some_list):
    some_list = ['new list']

sample = ['old list']
change_list(sample)
print(sample) # still prints ['old list']

好吧,这让我很困惑,因为我们将原始列表传递给函数,而不是列表的副本,python不应该将sample的指针改为现在指向['new list']

更奇怪的是,下面的代码实际上会导致sample指向['new list']

def change_list(some_list):
    some_list[:] = ['new list']

sample = ['old list']
change_list(sample)
print(sample) # now prints ['new list']

根据python的内存模型,上面代码中的[:]符号有什么特别之处。我的猜测是some_list[:]是我们传递的列表的副本,但是现在sample指向副本


Tags: sample对象函数代码列表newdef副本
1条回答
网友
1楼 · 发布于 2024-04-28 16:21:04

首先,使用some_list = ['new list']只是让some_list指向其他东西。它不会改变存储在该存储位置的内容。它不影响some_list所指的内容。至于[:],当你说some_list[:] = ...时,实际上是在为some_list.__setitem__(slice(0, None), ...)做一个快捷方式。它与设置some_list[4]相同,只是规模更大

相关问题 更多 >