通过赋值

时间:2016-02-26 18:56:56

标签: python list function

据我所知,当我们将列表传递给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']

好的,所以这让我感到困惑,因为我们将原始列表传递给函数而不是列表的副本,不应该将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指向副本?

1 个答案:

答案 0 :(得分:0)

首先,使用some_list = ['new list']只是让some_list指向别的东西。它不会更改该内存位置的内容。它不会影响some_list过去引用的内容。对于[:],当您说some_list[:] = ...时,您实际上正在为some_list.__setitem__(slice(0, None), ...)执行快捷方式。它与设置some_list[4]相同,只是规模较大。