RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 662398
Accepted
Молодой еще
Молодой еще
Asked:2020-05-05 21:35:42 +0000 UTC2020-05-05 21:35:42 +0000 UTC 2020-05-05 21:35:42 +0000 UTC

什么是 Python 中的对象。为什么 id(a) == id(b) == id(1)?

  • 772

我会详细说明这个问题。
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
  • 3 3 个回答
  • 10 Views

3 个回答

  • Voted
  1. jfs
    2020-05-05T22:02:52Z2020-05-05T22:02:52Z

    在不同的时间,同一对象可能与不同的其他对象相关联。

    你的意思是:在不同的时间,同一个名字可以指代不同的对象

    Python 中的模型很简单——您绝对不需要知道什么是地址、内存单元和指针。只知道它们所依附的名称和对象就足够了。

    这里有一些图片解释了 C 语言中的变量和 Python 中的名称之间的区别。标签和球足以解释任何 Python 级别的行为——起初很难相信这样一个简单的模型涵盖了所有边缘情况。

    a, b, 1 是不同的对象,不是吗?

    你只有一个对象(单位)。小整数缓存在 CPython 中。不同的名称a、b 指的是同一个对象:( a is b) id(a) == id(b)。1它在源代码中是一个常量(将其视为对对象调用构造函数)。有关int对象的更多信息:Python 中的赋值。

    一 = 1000000; b = 1000000;print (id(a) == id(b)) # 真

    要检查名称是否引用相同的对象,请使用a is b(这里它等同于id(a) == id(b),但id在一般情况下可以重新定义)。

    结果可能是True(取决于 Python 代码在所选实现中如何编译成字节码),但不一定是True:

    >>> a = 1000000
    >>> b = 1000000
    >>> print (a is b) 
    False
    

    在这种情况下,每个表达式都单独编译a,并b引用不同的对象。相比:

    >>> def f():
    ...     a = 1000000
    ...     b = 1000000
    ...     print(a is b)
    
    >>> f()
    True
    

    函数代码作为一个整体被编译,因此它a is b 可能(但不一定)是True. 这些对象中的一个或多个可能取决于 Python(CPython、Pypy、Jython 等)的实现,甚至取决于实现的特定版本。真正的代码不应该依赖于这样的实现细节。正如链接中明确指出的那样:不要使用身份检查来比较数字(不同的对象可以具有相同的值)。用于a == b查明数字是否相等。

    Python 是所有对象。没有变量名。因此我的问题。

    Python当然有名字。这些是你问题中的名字a。 b

    不同表示形式的 Python 代码可以作为一个简单的对象来操作(作为参数传递给函数,从函数返回,调用方法等)这一事实并没有取消名称的存在。

    例子:

    • 在 AST 级别,名称是类型的节点_ast.Name。一个更复杂的例子是MacroPy

    • 在字节码级别(byteplay)

    • 源代码(lib2to3)

    此外,对于操作 Python 代码,了解 compile()、eval()、exec() 内置函数、dis、uncompyle6、inspect 模块可能很有用。例如,inspect.signature()它允许您将函数的描述作为对象进行操作。已经提到的链接显示了 CPython 实现中对象占用的内存如何也可以像使用 ctypes 的常规 Python 对象一样进行操作(该示例更改了在 Python 级别不可变的 int 类型的对象)。

    • 15
  2. Best Answer
    Xander
    2020-05-05T21:59:39Z2020-05-05T21:59:39Z

    在 python 中,解释器经过优化,因此小整数由单个对象表示 - 这样做是为了提高性能。对于大数字,这不再是正确的。

    Mark Lutz - 学习 Python,第 4 版,2011 年,第 204 页:

    >>> X = 42 
    >>> Y = 42  # Должно получиться два разных объекта 
    >>> X == Y
    True
    
    >>> X is Y  # Тот же самый объект: кэширование в действии!
    True
    

    在此示例中,变量XandY必须相等(==,相同的值)但不等价(is,相同的对象),因为计算了两个不同的文字表达式。然而,由于小整数和字符串被缓存和重用,运算符is报告变量引用同一个对象。

    • 11
  3. Dmitry Ponyatov
    2020-05-06T00:44:49Z2020-05-06T00:44:49Z
    1. 变量只存储对对象的引用
    2. 运算符将引用= 分配给变量
    3. 具有相同值的原始类型(字面量:数字、字符串)由单个对象表示
    • 3

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5