当两个变量的值相同时,它们的内存地址相同?



我在Python中保持两个不同变量的值相同,以知道它们的内存地址也将通过使用id()函数相同,是的,这两个变量的内存地址是相同的,但我在c++中做了同样的过程,所以我得到了它们两个内存地址使用(&)操作符不同所以我必须知道c++或Python

里面到底有什么

Python的工作方式与c++不同。在c++中,每个变量都与一个内存地址相关,并且该内存地址被值填充。每个对象必须在定义时键入,以便编译器知道如何解释二进制文件。

在Python中,一切都是对象。"variables"只是指向对象的名称。与c++不同,变量没有类型,对象有类型。可以使用多个名称来引用同一个对象。例子:

a =[1](创建一个列表对象,以名称a引用它)

b = a(没有创建新对象,但现在a和b都指向单个列表对象。它们的id是一样的。通过a[0] = 2改变列表中的值将同时改变a和b,因为列表是可变的)

b = 'test' (b现在指向一个字符串对象)

b = [1] (b现在指向一个NEW列表对象,它的id将不同于a)

Python还缓存一个特定值的整数和短字符串。所以:A = 5

b = 5

将具有相同的id,即使

a = [1]

b = [1]

将有不同的id

所以我必须知道c++或Python内部到底是什么

这些是不同的语言,每个语言都有自己的语法、语义和规则。你不能直接比较这两者

Python

在python中,当我们执行赋值时我们实际上创建了一个对象引用。您可以在python中使用is操作符来确认这一点,如下所示。例如,我们有:

a = [1,2,3]
b = a;       //b is a reference to the object referred to by a
print(a == b)  #true
print(a is b)  #true

在上面的例子中,当我们执行赋值b = a时,我们实际上创建了一个名为b的变量,该变量引用了a引用的同一个列表对象。这意味着这里只涉及一个list对象,而不是两个。

还要注意,在python中可能有缓存涉及小整数和字符串。 c++

首先注意,在c++中,初始化和赋值是不同的。我们将在下面的例子中使用初始化:

int a = 4;
int b = a; //b is a distinct object than a but both have same value `4`

std::cout << a <<" " << b << std::endl;   //4 4
std::cout << &a << " " << &b << std::endl; //0x7ffca06a0ba0 0x7ffca06a0ba4

在上面的代码片段中,ab是不同的对象,这意味着它们有不同的地址,因此在输出中我们得到不同的地址。也就是说,在这种情况下,涉及到两个不同的int对象。

还要注意,在c++中,有一种方法可以使用引用来模拟python中的效果:

int a = 4;
//--v------->note the reference used here
int &b = a; //b is an alias for the same object named a

std::cout << a <<" " << b << std::endl;    //4 4
std::cout << &a << " " << &b << std::endl; //0x7ffca06a0ba0 0x7ffca06a0ba0

在上面的例子中,b是对名为a的对象的引用。因此,在输出中,我们得到了打印到控制台上的相同地址。也就是说,这里只涉及一个int对象。

最新更新