查看对象的内存地址
- 使用id(),id(object)函数返回对象在其生命周期内的内存地址
==和is区别
- ==是比较两个对象的内容是否相等。
- is是比较两个对象的id值是否相等,也就是比较两个对象是否为同个实例对象,是否指向同一个内存地址。
代码块:一个模块文件,一个函数体,一个类,交互式命令行中的单行代码都是一个代码块
==和is的区别,两对象是int
- 小整数对象[-5, 256]是在全局解释器内重复使用,不会被GC回收。
- python内部为了将性能进一步提高,凡是在一个代码块中创建整型对象,如果存在一个值与其相同的对象在该代码块中,那么就直接引用不需要创建,否则创建一个新的对象出来。
- python 出于对性能的考虑,但凡是不可变对象在同一代码块中有值相同的对象,就不会被创建,而是直接引用已存在的对象。
- 例:小整数对象
c = 3
def fun():
a = 3
b = 3
print(a is b)
print(a is c)
fun()
代码运行结果:
- 例 普通整型对象:
c = 300
def fun():
a = 300
b = 300
print(a is b)
print(a is c)
fun()
代码运行结果:
==和is的区别,两对象是str
- 如果对象str中全是字母或数字时,==和is没有区别;
- 如果对象str中含有特殊符号时,当两对象在同一代码块中,==和is作用一样;两个对象在不同代码块中,两个对象的值相等时,两个对象使用is时返回False。
例子:
- 对象str中含有特殊符号:
c = "zhang@"
def fun():
a = "zhang@"
b = "zhang@"
print(a is b)
print(a is c)
fun()
代码运行结果:
- 对象str中全是字母:
c = "zhang"
def fun():
a = "zhang"
b = "zhang"
print(a is b)
print(a is c)
fun()
代码运行结果:
- 对象str中含有字母和数字:
c = "zhang123"
def fun():
a = "zhang123"
b = "zhang123"
print(a is b)
print(a is c)
fun()
代码运行结果:
- 字符串中单个*20的对象的内存地址一样
c = "a" * 20
def fun():
a = "a" * 20
b = "a" * 20
print(a is b)
print(a is c)
fun()
代码运行结果:
- 单个字符*21及以上内存地址不一样 :
c = "a" * 21
def fun():
a = "a" * 21
b = "a" * 21
print(a is b)
print(a is c)
fun()
代码运行结果: