【问题标题】:When variables refer to the same object, how is that called, and why does python have this feature?当变量引用同一个对象时,是怎么调用的,为什么python有这个特性?
【发布时间】:2013-05-20 22:18:47
【问题描述】:

在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.']

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

【问题讨论】:

  • 如果不是这种情况,函数参数将如何工作?
  • 呵呵,可能我的书错了。
  • 你在看什么书?
  • 面向绝对初学者的 Python,第二版

标签: python python-2.7 reference pass-by-reference


【解决方案1】:

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

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

这样做的具体好处是什么

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

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

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

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

其他语言没有这个问题

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

【讨论】:

  • 跟踪引用计数是垃圾收集(回收内存)在某些语言中的工作方式。
  • 这样就可以节省内存了。好的。用户定义的对象如何交互有什么好处吗?
  • @PyRulez:这主要是为了节省空间,但您可以在某些类/数据结构中利用这种行为。例如。 Player 对象列表可以共享一个 Board,然后您可以将其用作通信设备。不过,不要试图对此过于聪明,因为它确实是潜在的错误来源。
猜你喜欢
  • 2021-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-11
  • 1970-01-01
  • 2015-01-18
相关资源
最近更新 更多