我会详细说明这个问题。
Python 书籍说 Python 中的一切都是对象。
我们采用传统方法学习/教授编程语言。Pascal、C、C++这些语言,它们都有“变量名”(标识符)的概念。值关联/分配给变量名称。该值存储在内存中。变量名是一种(在程序的源代码中)引用内存位置以获取存储在那里的值的方式。
我不知道这个说法是否正确(对于编译语言):对于变量,例如整数类型,在计算机上执行程序时,处理器已经使用值所在的存储单元的地址的变量被存储。那些。并不是在某个地址的某个地方存储了变量的名称,并且它与存储值的单元格的地址相关联。
现在让我们继续学习 Python。在这种语言中,一切都是对象,即使是函数的定义也是如此。
变量对象、值对象等 在不同的时间,同一对象可能与不同的其他对象相关联。
a = 1
print(a)
a = "Hello"
print(a)
但是如何理解函数的作用id()呢?按照标准的定义,它返回“识别”指定的对象。此外,“返回一个保证唯一的整数”,并且在对象存在期间保持不变。
所以为什么
a = 1
b = 1
print(id(a) == id(b) == id(1)) # True
print("Why?")
a, b, 1 是不同的对象,不是吗?
我认为问题是...
使用 Python 3.6
我听说过从 -5 到 256 的值。有地方去
a = 1000000
b = 1000000
print(id(a) == id(b)) # True
print("Why?")
因为“知道名字等”就足够了。对我来说还不够,这就是为什么我问受人尊敬的专业人士。在 Python 中,一切都是对象。没有变量名。因此我的问题。
你的意思是:在不同的时间,同一个名字可以指代不同的对象
Python 中的模型很简单——您绝对不需要知道什么是地址、内存单元和指针。只知道它们所依附的名称和对象就足够了。
这里有一些图片解释了 C 语言中的变量和 Python 中的名称之间的区别。标签和球足以解释任何 Python 级别的行为——起初很难相信这样一个简单的模型涵盖了所有边缘情况。
你只有一个对象(单位)。小整数缓存在 CPython 中。不同的名称a、b 指的是同一个对象:(
a is b)id(a) == id(b)。1它在源代码中是一个常量(将其视为对对象调用构造函数)。有关int对象的更多信息:Python 中的赋值。要检查名称是否引用相同的对象,请使用
a is b(这里它等同于id(a) == id(b),但id在一般情况下可以重新定义)。结果可能是
True(取决于 Python 代码在所选实现中如何编译成字节码),但不一定是True:在这种情况下,每个表达式都单独编译
a,并b引用不同的对象。相比:函数代码作为一个整体被编译,因此它
a is b可能(但不一定)是True. 这些对象中的一个或多个可能取决于 Python(CPython、Pypy、Jython 等)的实现,甚至取决于实现的特定版本。真正的代码不应该依赖于这样的实现细节。正如链接中明确指出的那样:不要使用身份检查来比较数字(不同的对象可以具有相同的值)。用于a == b查明数字是否相等。Python当然有名字。这些是你问题中的名字
a。b不同表示形式的 Python 代码可以作为一个简单的对象来操作(作为参数传递给函数,从函数返回,调用方法等)这一事实并没有取消名称的存在。
例子:
在 AST 级别,名称是类型的节点
_ast.Name。一个更复杂的例子是MacroPy在字节码级别(byteplay)
源代码(lib2to3)
此外,对于操作 Python 代码,了解 compile()、eval()、exec() 内置函数、dis、uncompyle6、inspect 模块可能很有用。例如,
inspect.signature()它允许您将函数的描述作为对象进行操作。已经提到的链接显示了 CPython 实现中对象占用的内存如何也可以像使用 ctypes 的常规 Python 对象一样进行操作(该示例更改了在 Python 级别不可变的 int 类型的对象)。在 python 中,解释器经过优化,因此小整数由单个对象表示 - 这样做是为了提高性能。对于大数字,这不再是正确的。
Mark Lutz - 学习 Python,第 4 版,2011 年,第 204 页:
=分配给变量