class Temp:
    x = 10


def get_settings():
    return Temp()


if __name__ == '__main__':
    y1 = get_settings()
    y2 = get_settings()

    z1 = id(get_settings())
    z2 = id(get_settings())

    if id(y1) == id(y2):
        print('Same object y1 and y2')
    else:
        print('DIFFERENT object y1 and y2 (AS EXPECTED)')

    if z1 == z2:
        print('SAME object z1 and z2 (WHY???)')

输出:

DIFFERENT object y1 and y2 (AS EXPECTED)
SAME object z1 and z2 (WHY???)

我原以为Z1和Z2是不同的,但输出表明它们是同一个对象的id. 这是不是Python中的一个错误?还是我错过了什么.

推荐答案

the docs人起:

生命周期 不重叠的两个对象可能具有相同的id()值.

z1 = id(get_settings())行中的返回值get_settings()只是临时存储,该行之后不存在对它的引用.在第z2 = id(get_settings())行中,返回值恰好保存在相同的内存位置,因此具有与文档期望的ID相同的ID.

以不同方式显示此行为的简单示例:

class Temp:
    x = 10


def get_settings():
    return Temp()


if __name__ == '__main__':
    z2 = id(get_settings())
    y1 = get_settings()
    y2 = get_settings()

    z1 = id(get_settings())

    print(z1)
    print(z2)
    print(id(y1))
    print(id(y2))

    if id(y1) == id(y2):
        print('Same object y1 and y2')
    else:
        print('DIFFERENT object y1 and y2 (AS EXPECTED)')

    if z1 == z2:
        print('SAME object z1 and z2 (WHY???)')

输出:

2646019522272
2646019522512
2646019522512
2646019522320
DIFFERENT object y1 and y2 (AS EXPECTED)

请注意,现在z2id(y1)相同

Python-3.x相关问答推荐

CONNEXION.EXCEPTIONS.ResolverError:运行pyz文件时未命名模块

是什么原因导致Pandas=2.1.4和Pandas=1.4.2之间Pandas DataFrame中从Float64到int32的连续列转换方式不同

被多个\n拆分并保留

十进制浮点数到整型的转换错误

没有这样的命令';角色';-可靠分子

torch.stack([t1, t1, t1], dim=1)与torch.hstack([t1, t1, t1])之间有什么区别?

合并所有文件并获取特定列数据

如何将 WebDriver 传输到导入的测试?

来自嵌套字典的完整地址

获取字符串中的两个工作日之间的差异

如何通过 GitLab V4 api 列出 gitlab 项目中的所有项目变量

使用 selenium 加速网页抓取

如何将 SimpleGUI 与 Python 2.7 和 3.0 shell 集成

如何调试垂死的 Jupyter Python3 内核?

迭代器也是可迭代的吗?

登录csv文件的正确方法是什么?

如何使用 d.items() 更改 for 循环中的所有字典键?

python中的绝对导入是什么?

Python,Docker - ascii编解码器无法编码字符

如何将python日志(log)级别名称转换为整数代码