is和==的区别?¶我们一共讨论3个字符格式
strlistpd.DataFramea = "Hello world!"
b = "Hello world!"
print type(a)
print a is b
print a == b
a = [1,2,3]
b = [1,2,3]
print type(a)
print a is b
print a == b
import pandas as pd
a = pd.DataFrame({"x": [1,2,3]})
b = pd.DataFrame({"x": [1,2,3]})
print type(a)
print a is b
print a == b
我们发现a == b都是True,但是a is b都是False。
我们再看一组例子。
a = "Hello world!"
b = a
print type(a)
print a is b
print a == b
a = [1,2,3]
b = a
print type(a)
print a is b
print a == b
a = pd.DataFrame({"x": [1,2,3]})
b = a
print type(a)
print a is b
print a == b
我们发现直接将b = a后,a is b才会True。
这里的区别是,
a is b$\to$id(a) == id(b) $\to$ a和b相同
a == b$\to$a.__eq(b)__ $\to$ a和b相等而已
a = "Hello world!"
b = "Hello world!"
print type(a)
print a is b
print a == b
print id(a) == id(b)
print id(a)
print id(b)
a = [1,2,3]
b = [1,2,3]
print type(a)
print a is b
print a == b
print id(a) == id(b)
print id(a)
print id(b)
a = pd.DataFrame({"x": [1,2,3]})
b = pd.DataFrame({"x": [1,2,3]})
print type(a)
print a is b
print a == b
print id(a) == id(b)
print id(a)
print id(b)
这里我们会发现,虽然相等,但是相同的原因是,a和b的内存地址不同。
但是这里有一个意外,
a = "Hello"
b = "Hello"
print type(a)
print a is b
print a == b
print id(a) == id(b)
print id(a)
print id(b)
当处理单一字符串的时候,a和b会共用一个内存地址,因此这也是python快捷的原因之一。