列表的变量在Python中是一个对象吗?
在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
问题的原因是变量是对对象的引用。变量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 = 2
和id(x) == id(2)
的情况,整数是不可变的,而在CPython中,id
只是对象在内存中的位置。整数始终相同,因此在不同的地址上多次存储相同的整数将是一种浪费内存的做法。