如果实例实际上只是指向Python中对象的指针,那么当我在特定实例中更改数据属性的值时会发生什么?

时间:2019-10-13 16:01:30

标签: python-3.x

假设我定义“ Class original:”并创建一个class属性“ one = 4”。然后,我创建一个类“ First = original()”的实例。我的理解是,First现在包含指向原始的指针,并且“ First.one”将返回“ 4”。但是,假设我创建“ Second = original()”,然后设置“ Second.one = 5”。内存中到底发生了什么?是否使用class属性5创建了Class Original的新副本?

我创建了一个带有class属性为1的Class原始类。然后,我创建了该类的两个实例(First和Second),并验证了id(First.one)和id(Second.one)指向同一位置。他们都返回相同的地址。但是,当我创建Third = original()并设置Third.one = 5然后检查id(Thrid.one)时,它似乎指向了其他地方。它指向哪里,发生了什么事?当我检查original.one时,它仍然返回“ 4”,因此显然原始对象没有被修改。谢谢。

1 个答案:

答案 0 :(得分:0)

您似乎正在询问一段与此类似的代码:

class Original:
    def __init__(self, n):
        self.one = n

first  = Original(4)
second = Original(4)

third  = Original(5)

print(id(first.one))
# 140570468047360

print(id(second.one))
# 140570468047360

print(id(third.one))
# 140570468047336
  

假设我定义“ Class original:”并创建一个class属性“ one = 4”。然后,我创建一个类“ First = original()”的实例。我的理解是,First现在包含一个指向原始

的指针

不。该变量引用您创建的实例,而不是类。如果它引用了该类,那么您将没有办法进入刚刚创建的实例。

实例当然会在其对象标头中的某个位置包含指向其类的指针。如果没有该指针,将无法进行方法查找,因为您将无法从实例中找到该类。

  

和“ First.one”将返回“ 4”。

是的。 one的属性first包含一个指向对象4(它是类int的实例)的指针。

[请注意,从技术上讲,某些Python实现将执行优化并实际上将对象4直接存储在属性中,而不是指向该对象的指针。但这是内部实现细节。]

  

但是,假设我创建“ Second = original()”,然后设置“ Second.one = 5”。内存中到底发生了什么?是否会创建class属性为5的Class original的新副本?

不。为什么需要一个单独的班级副本?这两个实例的方法仍然相同。实际上,这正是精确地的原因,Python中的方法将实例作为其第一个参数!这样,只需要一种方法。 (实际上,每种OO语言都是相同的,除了在大多数其他语言中,此参数是“不可见的”,并且只能在Ruby,Smalltalk,Self和Newspeak中使用特殊的关键字,例如self或{{1 }},Java,C#和Scala。)

  

我创建了一个带有class属性为1的Class原始类。然后,我创建了该类的两个实例(First和Second),并验证了id(First.one)和id(Second.one)指向同一位置。他们都返回相同的地址。但是,当我创建Third = original()并设置Third.one = 5然后检查id(Thrid.one)时,它似乎指向了其他地方。

我不太清楚您的问题在这里。 thisfirst.one都指向second.one,因此它们都指向相同的ID,因为它们都指向相同的对象。 4指向third.one,这显然是与5不同的对象,所以自然地,它具有不同的ID。

事实上,ID的要求之一是同时存在的不同对象必须具有不同的ID。

  

它指向何处以及发生了什么事?

同样,不清楚您要问什么。

它指向4,什么也没发生。

  

当我检查original.one时,它仍然返回“ 4”,因此很明显原始对象没有被修改。

的确如此。为什么会这样?