对于如下代码:
x = "a"
y = "a"
print(x is y)
z = [1, 2, 3]
w = [1, 2, 3]
print(z is w)
输出结果为
True
False
按理说x与y时一样的,x=y是没问题的,z,w也一样的数据但是结果却是false,这是为什么呢?
这就要根据对象来说明了,x和y都是字符串,他默认是一个不可变的对象,因此他们指向的是同一个元素地址,但是列表时可变的,虽然z,w的数据一样,但是他们时分别来开辟内存,他指向的地址是不一样的,因此时false。
对于列表会有建立方法,第一种是循环方式,第二种时直接建立,但是,这两种的内存指向时不同的。
A = [0, 0, 0]
for i in range(3):
A[i] = [0] * 3
print(A)
B = [[0]*3]*3
print(B)
内存指向如下所示:
这里可以看到A的内存指向时相互独立的,但是对于第二种方法他是指向第一个对象的。于是有了以下的情况:
B[0][0] = 1
print(B)
输出:
[[1, 0, 0], [1, 0, 0], [1, 0, 0]]
同样:
print(B[0] is B[1])
输出为:true
可以验证上述B的内存指向
而对于A这个嵌套列表,同样方法进行测试:
A[0][0] = 1
print(A)
print(A[0] is A[1])
输出结果为:
[[1, 0, 0], [0, 0, 0], [0, 0, 0]]
False
由此可以验证图所指向的内存结构
当然,对于单纯的数值判断可以直接用==来进行
print(B[0] == B[1])
print(A[1] == A[2])
输出:
True
True