赋值语句内存分析

释放双眼,带上耳机,听听看~!
  • 使用id()方法访问内存地址
  • 使用is比较内存引用地址是否相等
 
>>> a = 1
>>> id(a) # 获取a的内存地址
140583343533336 # 这是内存地址
>>> b = 2
>>> id(b)
140583343533312
>>> c = 5
>>> id(c)
140583343533240
>>> d = 5
>>> id(d)
140583343533240
>>> c == d # 比较的是值c的值是5,d的值也是5,5 == 5 返回 True
True
>>> c is d # 比较值还比较内存地址;值相等和内存地址也相等,确定是同一个东西,返回Ture
True
>>> e = 999999999 
>>> id(e) 
140583343568264
>>> f = 999999999
>>> id(f)
140583343568288
>>> e == f
True
>>> e is f
False
>>> 

Python对我们的值进行了内存的优化,对于一些比较小的数字、比较短的字符串它们的内存中都保存了同样的东西,也就是它们的值用等号相比是相等的情况下,它们内存中当中也是共用的,所以说我们用is比较短的数字时返回True,用is比较长的数字时返回False。

列表属于引用类型的数据

 
>>> g = []
>>> h = []
>>> id(g)
4425879496
>>> id(h)
4425985560
>>> g == h
True
>>> g is h
False
>>> 

列表不像简单数据、字符串,这里没有优化,所以这里返回False。

赋值方法

 
>>> x = 1
>>> id(x)
140583343533336
>>> y = x
>>> id(y)
140583343533336
>>> id(x)
140583343533336
>>> y = 2
>>> id(y)
140583343533312
>>> x
1
>>> id(x)
140583343533336
>>>

当y没有重新赋值时,还是和x共用内存地址,当y = 2时,y的内存地址发生了变化,x的内存不变。

经典案例分析

def extend_list(val, l=[]):
    l.append(val)
    return l


list1 = extend_list(10)
list2 = extend_list(123, [])
list3 = extend_list('a')

print(list1)
print(list2)
print(list3)

打印出list1、list2、list3的结果:

[10, 'a']
[123]
[10, 'a']

分析:首先我们发现了list1和list2的值是相同的,list1和list2都只传了参数一,list2传入两个参数。我们把案例的内存地址给打印出来添加两行id() 来查看传入前和传入后的地址:

def extend_list(val, l=[]):
    print('---------')
    print(l, id(l))
    l.append(val)
    print(l, id(l))
    return l


list1 = extend_list(10)
list2 = extend_list(123, [])
list3 = extend_list('a')

print(list1)
print(list2)
print(list3)

打印结果:

---------
[] 4490674656
[10] 4490674656
---------
[] 4491885376
[123] 4491885376
---------
[10] 4490674656
[10, 'a'] 4490674656
[10, 'a']
[123]
[10, 'a']

我们可以看到list1初始空列表内存地址:4490674656,然后传入参数10;list2传入新的空列表后内存地址为:4491885376,然后传入参数123;list3初始空列表内存地址和list1一样,然后传入参数a。

人已赞赏
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧