我假定Python中的序列类型是值类型。事实证明,它们是引用类型(意味着变量的值在分配给新变量时不会被复制,而是被引用)。所以现在我想知道,Python中的值类型是什么?也就是说,我可以将哪些类型的Python分配给新变量,而不用担心变量被引用?Python作为参考类型对待什么?
10
A
回答
17
全部 Python中的值是引用。你需要担心的是如果一个类型是mutable。基本的数字和字符串类型,以及tuple
和frozenset
是不可变的;绑定到其中一种类型的对象的名称只能被反弹,而不会发生变化。
>>> 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
4
上面的答案是正确的,但我反对“参考”的语义。
C语言的语言将变量视为固定桶,其中放置了值。当您调用一个函数时,会创建一组新的存储桶,并将这些值复制到它们中。有时候,一个桶是通过引用传递的,并且实际上变成了调用者桶的别名。
另一方面,Python将变量视为值(对象)的标签(名称)。当你调用一个函数时,会创建一组新的标签并将其打到这些相同的对象上。
在Python的上下文中提及“引用”是没有意义的,因为在所有其他语言中,“引用”意味着替代“值”。 Python没有这样的二元性;它只是传递并分配对象。没有什么是到。可能是Nitpicky,但是对于C++程序员来说,术语不会引起混淆。听到Python通过引用传递,不知道如何重新分配调用者的名字。
相关问题
- 1. 使参考数据的子对象成为什么类型?
- 2. 类型不推导为r值参考:为什么不呢?
- 3. 为什么它不是类型安全的将基类型实例转换为派生类型对象/参考
- 4. getClass()返回什么作为参考?
- 5. 爪哇 - 有什么办法从参考类型推断对象类型
- 6. 为什么数字10参考整数类型0?
- 7. 将参考类型作为参数传递并使用泛型
- 8. Html.BuildUrlFromExpression参考动作类型参数
- 9. 为什么选择参考类型的LayoutKind.Auto和值类型的LayoutKind.Sequential?
- 10. 为什么参考类型的sizeof会给你类型的大小?
- 11. NSNotificationCenter为观察者和对象提供什么类型的参考?
- 12. Linq2SQL参考类型
- 13. 传递cython参数作为参考与未知类型
- 14. 使用左值参考作为非类型模板参数
- 15. 互操作类作为泛型类型参数时出现什么问题?
- 16. 为什么类可以用作类型参数以及用于什么?
- 17. 将派生对象作为基类参考参数传递
- 18. Swift作为inout参数隐式传递自身作为参考类型
- 19. arguments_参考什么?
- 20. 为什么scala.xml.Atom类型参数化?
- 21. 当用作通用接口参数时,为什么`unit`被F#类型系统区别对待?
- 22. C#:为什么泛型类型推断工作时有多个类型参数?
- 23. 为什么不能模板非类型参数是类类型
- 24. 我在这个例子中错过了什么参考类型?
- 25. ASP.Net Web服务:什么对象类型用作参数集合?
- 26. 值类型和参考类型
- 27. 值类型和参考类型
- 28. 与参考类型对象类型拳击可变
- 29. 宏是什么类型的考虑?
- 30. 为什么我无法传递地址作为参考?
为了完整起见,应该注意的是,虽然元组是不可变的,但其中包含的任何可变对象可能会发生变异:'t = 1,[2],3; t [1] .append(42)' – 2011-05-28 00:58:59
为了完整起见,您可以添加我如何去复制/克隆值吗? – Hubro 2011-05-28 01:19:03
这取决于类型。对于列表,您可以将它传递给'list()'或切片整个事物('L [:]')。对于集合,传递给'set()'。对于其他类型,请参阅相关文档。请注意,*有*类型根本无法克隆,只是因为它们表示外部资源(例如'套接字')。 – 2011-05-28 01:28:25