Python:通过引用传递和切片分配

时间:2017-07-26 19:25:58

标签: python python-2.7 list function reference

在Python中,列表是通过引用函数传递的,对吗?

如果是这样,那里发生了什么?

>>> def f(a):
...     print(a)
...     a = a[:2]
...     print(a)
...
>>> b = [1,2,3]
>>> f(b)
[1, 2, 3]
[1, 2]
>>> print(b)
[1, 2, 3]
>>>

3 个答案:

答案 0 :(得分:6)

声明中:

a = a[:2]

您正在使用与输入参数f()相同的名称创建新的本地(a)变量

也就是说,你所做的相当于:

def f(a):
    print(a)
    b = a[:2]
    print(b)

相反,您应该更改a 到位,例如:

def f(a):
    print(a)
    a[:] = a[:2]
    print(a)

答案 1 :(得分:5)

当你这样做时:

a = a[:2]

它将a重新分配给新值(列表的前两项)。

所有Python参数都通过引用传递。您需要更改它所引用的对象,而不是让a引用新对象。

a[2:] = []
# or
del a[2:]
# or
a[:] = a[:2]

第一个和最后一个分配给列表的切片,就地更改列表(影响其值),中间一个也通过删除其余元素来更改列表的值。

答案 2 :(得分:4)

实际上,对象是通过引用传递的,但a = a[:2]基本上创建了一个指向列表切片的新局部变量。

要修改列表对象,可以将其分配给切片(切片分配)。

在此处考虑ab等同于您的全局b和本地a,此处为新对象分配a不会影响{{1} }}:

b

切片分配按预期工作:

>>> a = b = [1, 2, 3]    
>>> a = a[:2]  # The identifier `a` now points to a new object, nothing changes for `b`.
>>> a, b
([1, 2], [1, 2, 3])
>>> id(a), id(b)
(4370921480, 4369473992)  # `a` now points to a different object

相关:What is the difference between slice assignment that slices the whole list and direct assignment?