假设我定义“ 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”,因此显然原始对象没有被修改。谢谢。
答案 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)时,它似乎指向了其他地方。
我不太清楚您的问题在这里。 this
和first.one
都指向second.one
,因此它们都指向相同的ID,因为它们都指向相同的对象。 4
指向third.one
,这显然是与5
不同的对象,所以自然地,它具有不同的ID。
事实上,ID的要求之一是同时存在的不同对象必须具有不同的ID。
它指向何处以及发生了什么事?
同样,不清楚您要问什么。
它指向4
,什么也没发生。
当我检查original.one时,它仍然返回“ 4”,因此很明显原始对象没有被修改。
的确如此。为什么会这样?