2011-05-28 65 views
10

我假定Python中的序列类型是值类型。事实证明,它们是引用类型(意味着变量的值在分配给新变量时不会被复制,而是被引用)。所以现在我想知道,Python中的值类型是什么?也就是说,我可以将哪些类型的Python分配给新变量,而不用担心变量被引用?Python作为参考类型对待什么?

回答

17

全部 Python中的值是引用。你需要担心的是如果一个类型是mutable。基本的数字和字符串类型,以及tuplefrozenset是不可变的;绑定到其中一种类型的对象的名称只能被反弹,而不会发生变化。

>>> t = 1, 2, 3 
>>> t[1] = 42 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'tuple' object does not support item assignment 
+5

为了完整起见,应该注意的是,虽然元组是不可变的,但其中包含的任何可变对象可能会发生变异:'t = 1,[2],3; t [1] .append(42)' – 2011-05-28 00:58:59

+0

为了完整起见,您可以添加我如何去复制/克隆值吗? – Hubro 2011-05-28 01:19:03

+1

这取决于类型。对于列表,您可以将它传递给'list()'或切片整个事物('L [:]')。对于集合,传递给'set()'。对于其他类型,请参阅相关文档。请注意,*有*类型根本无法克隆,只是因为它们表示外部资源(例如'套接字')。 – 2011-05-28 01:28:25

4

上面的答案是正确的,但我反对“参考”的语义。

C语言的语言将变量视为固定桶,其中放置了值。当您调用一个函数时,会创建一组新的存储桶,并将这些值复制到它们中。有时候,一个桶是通过引用传递的,并且实际上变成了调用者桶的别名。

另一方面,Python将变量视为值(对象)的标签(名称)。当你调用一个函数时,会创建一组新的标签并将其打到这些相同的对象上。

在Python的上下文中提及“引用”是没有意义的,因为在所有其他语言中,“引用”意味着替代“值”。 Python没有这样的二元性;它只是传递并分配对象。没有什么是。可能是Nitpicky,但是对于C++程序员来说,术语不会引起混淆。听到Python通过引用传递,不知道如何重新分配调用者的名字。

+3

Python传值,但值是引用。 – 2011-05-28 06:08:59

+0

这很愚蠢。传递的值不是对象的引用;他们是对象。 – Eevee 2011-05-28 06:12:12

+2

也许这篇文章(http://bit.ly/4Cjmn0)和链接到它的SO问题(http://bit.ly/3fRXW)可以说明这一点。我发现文章中使用的术语有助于减少混淆。 此外,虽然我看到您对参考文献的观点,但我不同意它。标签或名称是一般意义上的参考。当我使用你的名字时,我*指*给你。 – cledoux 2011-05-28 13:53:38

相关问题