3

在python中,两个不同的变量可以代表同一个对象。观察:

>>> list1=['This is list1.']
>>> list2=list1
>>> list2[0] = 'This is actually list2 not list one.'
>>> print list1
['This is actually list2 not list one.']

这是此代码的链接。 如您所见,没有list1 或list2,只有一个有两个名称的列表。我很清楚这种效果,我从一本书中记得这是故意的,但我忘记了这种现象叫什么。另外,它是偶尔的bug来源,其他语言没有这个问题。我确实有一种感觉,如果没有它,某些与对象有关的事情就会崩溃。这有什么具体好处(因为我真的只知道python。)

4

1 回答 1

5

这通常称为对单个对象的多个引用。引用的数量称为refcount

在递归数据结构(树、链表)的情况下,它也可以称为结构共享。

这有什么具体好处

您不必复制值即可将其传递给函数。假设你有一个函数

def print_list(l):
    print("I see %d elements:" % len(l))
    for x in l:
        print(x)

当您将列表传递给此函数时,实际传递的只是对列表的引用,而不是列表内容的副本。同样,如果没有这个特性,像 , 等方法也append很难实现;他们必须一直构建和返回新列表。对于任何就地更改数据结构的函数或方法也是如此。extendsort

在进行多线程编程时,数据结构的共享实际上是建立通信的一种常用方式:多个线程将引用Queue它们用来传递消息的公共。

其他语言没有这个问题

在所有语言中,除了纯函数式语言,这可能是一个问题。在 C、C++、Go 和 Pascal 中,它可能会发生在指针中,在 Prolog 中会发生无意的统一,而在 Java 中,它的工作方式与 Python 中相同。

于 2013-05-25T13:01:35.813 回答