列表的变量在Python中是一个对象吗?

16 浏览
0 Comments

列表的变量在Python中是一个对象吗?

我理解a is b是错误的,但我不明白为什么a is [1,2,3]也是错误的。

我学到变量就像对象的昵称,比如x = 2id(x) == id(2)

id(a)id(b)不相同...

在这种情况下,a是一个对象?不是一个变量?

0
0 Comments

在Python中,一切皆为对象。在Python中,a is b的结果为False,因为它们不是同一个对象。它们都是List类的实例,因此在内存中具有不同的位置,完全独立,除了它们的类结构或蓝图外。id(a)id(b)会反映这一点,它们不是同一个对象,因此不会共享一个ID。这是它们在内存中的位置的引用,虽然ID并不是引用指针,但它们在描述它们不相同的方式上类似。

上述代码中,a = [1, 2, 3]b = [1, 2, 3]创建了两个不同的列表对象。由于它们是不同的对象,它们的ID不同,因此id(a) == id(b)的结果为False。为了展示它们在内存中的不同位置,我们可以使用id(a) - id(b)来计算它们ID之间的差异。

解决这个问题的方法是使用==运算符而不是is运算符来进行对象的比较。两者的区别在于,==比较的是对象的值,而is比较的是对象的身份。换句话说,==检查两个对象的值是否相等,而is检查两个对象是否为同一个对象。

参考链接:

- double equals vs is in python

- https://www.tutorialspoint.com/difference-between-and-is-operator-in-python

0
0 Comments

问题的原因是变量是对对象的引用。变量a和变量b并不引用同一个对象。尽管这两个对象是相同的,它们在内存中有唯一的地址,并且彼此不依赖。

解决方法是不要使用整数与is操作符,因为不同的Python实现可能会得到不同的结果。

具体代码如下:

>>> a = b = [1,2,3]
>>> c = [1,2,3]
>>> print(a is b)
True
>>> print(a is c or b is c)
False
>>> a.remove(1)
>>> print(a)
[2, 3]
>>> print(b)
[2, 3]
>>> print(c)
[1, 2, 3]

另外,对于x = 2id(x) == id(2)的情况,整数是不可变的,而在CPython中,id只是对象在内存中的位置。整数始终相同,因此在不同的地址上多次存储相同的整数将是一种浪费内存的做法。

0