我知道数值在python中是不可变的。我还读过python中的所有东西都是对象。我只是想知道数字类型是否也是python中的对象。因为如果它们是对象,那么变量实际上是引用变量对吧?这是否意味着如果我将一个数字传递给一个函数并在函数内修改它,那么会创建两个带有两个引用的数字对象? python中是否存在原始数据类型的概念?
注意:我也认为它是对象。但是在python导师中可视化说不同: http://www.pythontutor.com/visualize.html#mode=edit
def test(a):
a+=10
b=100
test(b)
或者它是可视化工具中的缺陷吗?
答案 0 :(得分:16)
是数字类型对象吗?
>>> 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?
答案 1 :(得分:5)
Everything 是一个对象,包括数字。没有“原始”类型,只有内置类型。
然而,数字是不可变的。使用数字执行操作时,您将创建一个新的数字对象。