我在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
对象,而不是两个。
首先注意,在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
在上面的代码片段中,a
和b
是不同的对象,这意味着它们有不同的地址,因此在输出中我们得到不同的地址。也就是说,在这种情况下,涉及到两个不同的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
对象。