我知道,在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
指向副本
首先,使用
some_list = ['new list']
只是让some_list
指向其他东西。它不会改变存储在该存储位置的内容。它不影响some_list
所指的内容。至于[:]
,当你说some_list[:] = ...
时,实际上是在为some_list.__setitem__(slice(0, None), ...)
做一个快捷方式。它与设置some_list[4]
相同,只是规模更大相关问题 更多 >
编程相关推荐