【问题标题】:In x = 1, are both x and 1 objects?在 x = 1 中,x 和 1 都是对象吗?
【发布时间】:2020-10-07 12:29:39
【问题描述】:

x = 1 中,x1 都是对象吗?因为print(1)x = 1; print(x) 会产生相同的输出。

甚至print函数的语法是:

print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)

【问题讨论】:

标签: python object assignment-operator


【解决方案1】:

Python 中的名称不是对象。在表达式中使用名称会自动计算出名称所引用的对象。不能以任何方式与名称本身进行交互,例如传递它或调用它的方法。

>>> x = 1
>>> type(1)    # pass number to function...
<class 'int'>  # ...and receive the number!
>>> type(x)    # pass name to function...
<class 'int'>  # ...but receive the target!

请注意,从技术上讲,1 也不是一个对象,而是一个对象的文字。只有对象可以被传递——它不会显示它是来自文字 1 还是来自诸如 2 - 1 之类的数学表达式。

【讨论】:

  • 但是当程序运行时,1在内存中变成了int对象,对吧?
  • 当表达式1被求值时,它的结果是一个值为1的int对象。
  • 嘿,这是什么意思? - “只有对象可以被传递——它不显示它是源自文字 1 还是源自诸如 2 - 1 之类的数学表达式。”
  • 这意味着就像一个函数无法知道参数值1是来自文字1还是名称x一样,它也不知道值1是否来自文字1或文字表达式2-11 恰好是值 1 的文字标准表示,但它不是这个值。
  • @NSR 通常使用由对象的标准表示组成的表达式作为该对象的替代。例如,文字表达式1 引用值为1 的整数,或者文字表达式True 引用值为True 的布尔值。 这种不精确性在日常使用中完全可以正常使用。然而,当仔细观察该语言的工作原理时,即使名称表达式 (x) 没有传递给函数,也可能会令人困惑地认为文字表达式 (1) 传递给函数 - 事实上在这两种情况下只有对象被传递。
【解决方案2】:

1 是一个 int 对象。 x 是一个引用对象的变量。

如需更深入地了解pass-by-reference vs pass-by-value see this answer。它说:

变量不是对象。

print() 将输出对象的表示,1x 都指向。

在这种情况下,有趣的是,您可以通过简单地创建更多具有相同值但指向不同实例的变量来创建相同对象的多个实例。例如:

x = 1000
y = 1000
z = 1000

这是 3 个不同的对象,它们彼此相等,但仍然是独立的对象。

For numbers from -5 to 255, the python interpreter will cache the object instances 以便该范围内的所有整数只有一个实例。如果上面的示例是 1 而不是 1000,xyz 实际上将指向同一个对象。

【讨论】:

  • x 不是变量 - 它是一个名称
  • @JonClements 不知道。我的非 python 术语在这里流淌。我会做一些研究和编辑。谢谢!
  • 不用担心...如果您还没有阅读 nedbatchelder.com/text/names.html - 那么它非常值得一读
  • @Jon Clements 该链接提到 “Python 有变量,它们的工作方式与 C 中的变量不同。”.
  • @NSR 是的......由于 Python 数据模型的工作方式,将它们视为“名称”基本上更容易,但变量很好 - 只是更令人困惑。
猜你喜欢
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
  • 2011-11-20
  • 1970-01-01
  • 2016-10-20
  • 1970-01-01
  • 1970-01-01
  • 2017-03-02
相关资源
最近更新 更多