当前位置: 首页 > 面试题库 >

不同的类实例使用相同的内存位置

郗浩
2023-03-14
问题内容

pickle当我发现有时候,不同的类实例位于相同的内存位置时,我正在玩图书馆。

下面的两个示例都展示了上述行为:

class DemoClass:
    def __init__(self):
        self.name = 'demoName'

#example 1
for i in range(3):
    print (DemoClass())

#example 2
[print(DemoClass()) for i in range(3)]

#Output for both example 1 and example 2
#Note that the memory locations are identical in the output
<__main__.DemoClass object at 0x00CEE610>
<__main__.DemoClass object at 0x00CEE610>
<__main__.DemoClass object at 0x00CEE610>

这让我很吃惊,所以也许您可以 解释为什么发生这种情况

该程序按我期望的方式运行,如下所示。

demo = [DemoClass() for i in range(3)]
for i in demo:
    print (i)

#Output
<__main__.DemoClass object at 0x01F7E630>
<__main__.DemoClass object at 0x01F7ED30>
<__main__.DemoClass object at 0x01F7E670>

问题答案:

您的问题与Python如何分配内存有关。 tldr; Python使用堆来存储内存。释放资源后,它会到达堆的顶部。

Python必须分配内存来创建对象的实例。为了提高内存效率,Python内存管理器具有大量的内存位置,可用于为对象实例提供或保留对象。使用您的一些示例,您可以看到它在实践中是如何工作的。

例子1

>>> for i in range(3):
...     print(DemoClass())
... 
<test.DemoClass instance at 0x288b248>
<test.DemoClass instance at 0x288b248>
<test.DemoClass instance at 0x288b248>

for循环的第一次迭代期间,python使用其当前堆中的第一个可用地址,即<0x288b248>DemoClass为该print调用创建一个实例。一旦print命令完成,存储器地址被释放并返回到
堆的顶部 。在循环的下一次迭代中,python使用第一个可用的内存地址,该地址也是address <0x288b248>。等等。

范例#2

>>> for j in [DemoClass() for i in range(3)]:
...     print(j)
... 
<test.DemoClass instance at 0x288bcf8>
<test.DemoClass instance at 0x288b290>
<test.DemoClass instance at 0x288b638>

python在这里生成一个列表,然后将对其进行遍历。列表的创建要求为每个元素创建一个DemoClass的
实例。这将从堆中删除前三个地址。循环完成后,列表将从内存中释放出来,如果再次调用它,print(DemoClass)我们会发现python再次在重用内存。

>>> print DemoClass()
<test.DemoClass instance at 0x288bcf8>

示例3(我的交替内存分配示例)

>>> for i in range(4):
...     Demo = DemoClass()
...     print(Demo)
... 
<test.DemoClass instance at 0x288bcf8>
<test.DemoClass instance at 0x288b290>
<test.DemoClass instance at 0x288bcf8>
<test.DemoClass instance at 0x288b290>

在此示例中,每次Demo实例化为的实例时DemoClass,都将内存段分配给Demo。然而,调用print(Demo)不能
自由分配到内存Demo。在下一个循环的开始,将分配一个新的内存段,Demo然后Demo将其 覆盖
,这时它的原始内存地址将返回到堆的顶部。Demo然后用于的内存地址在两个内存地址之间交替。



 类似资料:
  • 目前,我有一个类分数,它允许我用三种不同的方式创建分数 对于一个整数,在这种情况下,给定的整数将是分子,分母将设置为1 有2个整数,分子和分母 最后一种方法是解析一个字符串,该字符串必须与REGEX-?\d/[1-9]\d* gcd将尽可能减少生成的分数。 我现在想实现的是,具有相同分子和分母的分数实例具有相同的引用例如。 应该返回true。 我研究了一些关于泛型和边界的章节,但我不确定这是否是我

  • 问题内容: 我正在尝试同时打开多个浏览器,但无法在多个窗口中浏览到该网站。 这是我的方法: 这样称呼它: 不幸的是,在打开第二个窗口后-显示超时错误: WebDriver.dll中发生类型’OpenQA.Selenium.WebDriverException’的第一次机会异常 附加信息:60秒后,对URL http:/ loca1host:50148 / session的远程WebDriver服务

  • 我需要编写一个java方法来从一个对象中获取特定的信息。但是,该对象可以是A类型的,也可以是B类型的。下面是我的代码的一部分: 当我这样写它时,它会引发一个错误,说“重复方法”。我怎么才能让这个起作用?

  • 我有一个注册程序,用户可以在餐厅预订餐桌。 因为我需要存储潜在的无限量的客户,所以我不能显式地创建Customer类的新实例,因为我需要能够在运行时添加它们。 我想过使用HashMap通过他们填写的注册表插入每个用户,但是,它不是保留每个客户的唯一值,而是用哈希图中的最新条目覆盖它们。 明确地说,键正在改变,它成功地添加了一个新的键,但是前一个键中的值被覆盖了 例子 类客户有 3 个设置器:设置

  • 我试图打开两个实例ChromeDriver具有相同的配置文件如下: 问题是第一个驱动程序工作并导航到Google,但在第二个驱动程序中,我在实例化第二个驱动程序时遇到以下异常: 附加信息:抛出了一个带有空响应的异常,该异常向远程WebDriver服务器发送HTTP请求以获取URLhttp://localhost:6949/session.异常的状态为ReceiveFailure,消息为:基础连接已

  • 我有一个类,它有两个相同类型的最终字段,我需要在第二个字段中注入if属性