【问题标题】:Are numbers considered objects in python?python中的数字是否被视为对象?
【发布时间】:2015-08-01 03:53:58
【问题描述】:

我知道数值在 python 中是不可变的。我还阅读了 python 中的一切是如何成为对象的。我只想知道数字类型是否也是python中的对象。因为如果它们是对象,那么变量实际上是引用变量,对吗?这是否意味着如果我将一个数字传递给一个函数并在函数内部对其进行修改,那么会创建两个具有两个引用的数字对象? python中有原始数据类型的概念吗?

注意:我也认为它是对象。但是在 python 导师中可视化说不同: http://www.pythontutor.com/visualize.html#mode=edit

def test(a):
    a+=10
b=100
test(b)

还是可视化工具的缺陷?

【问题讨论】:

    标签: python object visualization


    【解决方案1】:

    数字类型是对象吗?

    >>> isinstance(1, object)
    True
    

    显然他们是。 :-)。

    请注意,您可能需要稍微调整一下object 的心理模型。在我看来,您将object 视为“可变”的东西——事实并非如此。实际上,我们需要将 python 名称视为对对象的引用。该对象可能包含对其他对象的引用。

    name = something
    

    这里,右手边被求值——所有的名字都被解析为对象,表达式的结果(一个对象)被“name”引用。

    好的,现在让我们考虑一下将某些内容传递给函数时会发生什么。

    def foo(x):
       x = 2
    
    z = 3
    foo(z)
    print(z)
    

    我们期望在这里发生什么?好吧,首先我们创建函数foo。接下来,我们创建对象3 并通过名称z 引用它。之后,我们查找z 引用的值并将该值传递给foo。输入foo 后,该值被(本地)名称x 引用。然后我们创建对象 2 并通过本地名称 x 引用它。注意,x 与全局 z 无关——它们是独立的引用。仅仅因为他们在您输入函数时引用了同一个对象并不意味着他们必须一直引用该函数。我们可以使用赋值语句随时更改名称引用的内容。

    请注意,您使用 += 的示例可能会使事情复杂化,但您可以将 a += 10 视为 a = a + 10 如果它在这种情况下有所帮助。有关 += 的更多信息,请查看:When is "i += x" different from "i = i + x" in Python?

    【讨论】:

    • 问题的第二部分呢?
    • @WajdiFarhani -- 抱歉,发帖可能有点太着急了。我已经详细阐述了很多,希望能涵盖完整的答案。
    • @mgilson 感谢您的链接!在旁注中,您能告诉我为什么可视化不同吗?为什么数字不表示为对象?
    • @mgilson 您提到“我们查找 z 引用的值并将该值传递给 foo”...您是说数字是按值传递而不是按引用传递吗?
    • @user567 -- 我听说它被描述为“按对象传递” -- 基本上,您将引用解压缩到它的对象中,然后在函数中创建对它的新引用。从根本上说,在 C 中传递指针并没有太大区别。您可以修改指针在函数中指向的东西,但不能使指针指向其他东西(并期望在外部看到这种变化功能)。唯一的区别是一些 python 对象没有公开任何修改它们的方法(“不可变”)。
    【解决方案2】:

    一切 在 Python 中都是一个对象,其中包括数字。没有“原始”类型,只有内置类型。

    然而,数字是不可变的。当您对数字执行操作时,您正在创建一个新的数字对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-11
      • 1970-01-01
      • 2013-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多