Python编程学习:python id()函数和内存分配理解

1.  id()函数可返回对象的内存地址

python中会为每个对象分配内存,哪怕他们的值完全相等。id(object)函数是返回对象object在其生命周期内位于内存中的地址,id函数的参数类型是一个对象。如下例子:c, d 和 2.0 地址不同,但值相等。

 
  1. c = 2.0

  2. d = 2.0

  3. print(id(c),id(d),id(2.0))

  4. print('c == d:',c==d)

  5. print('c is d:',c is d)

c == d 比较的是c和d的值是否相等,c is d 则比较的是c和d内存(或id)是否一样。

 
  1. 2537439396824 2537439396776 2537439396800

  2. c == d: True

  3. c is d: False

2. 为了提高内存利用效率对于一些简单的对象,如一些数值较小的int对象,字符串对象等,python采取重用对象内存的办法.

    (1)如指向a=2,b=2时,由于2作为简单的int类型且数值小,python不会两次为其分配内存,而是只分配一次,然后将a与b同时指向已分配的对象。

 
  1. a = 2

  2. b = 2

  3. print(id(a),id(b),id(2))

  4. print('a == b:',a==b)

  5. print('a is b:',a is b)

  6. 1683941872 1683941872 1683941872

  7. a == b: True

  8. a is b: True

 
  1. e = 'test'

  2. f = 'test'

  3. print(id(e),id(f),id('test'))

  4. print('e == f:',e==f)

  5. print('e is f:',e is f)

  6. 2537402630528 2537402630528 2537402630528

  7. e == f: True

  8. e is f: True

     (2)如对于数值较大的int对象,python会为aa和bb分别申请一块内存,来存储1999839。

 
  1. aa = 1999839

  2. bb = 1999839

  3. print(id(aa),id(bb),id(1999839))

  4. print('aa == bb:',aa==bb)

  5. print('aa is bb:',aa is bb)

  6. 2537439576464 2537439576368 2537438627472

  7. aa == bb: True

  8. aa is bb: False

3. 内存分配理解

       x=3这句的执行过程并不是先获取x原来指向的对象的地址,再把内存中的值更改为3,而是新申请一段内存来存储对象3,再让x去指向对象3,所以两次id(x)的值不同。

 
  1. x=2

  2. print(id(2))

  3. print(id(x))

  4. x=3

  5. print(id(3))

  6. print(id(x))

  7.  
  8. 1683941872

  9. 1683941872

  10. 1683941904

  11. 1683941904

 
  1. L=[1,2,3]

  2. M=L

  3. print(id(L))

  4. print(id(M))

  5. print(id(L[2]))

  6. L[0]=2

  7. print(id(L))

  8. print(M)

  9.  
  10. 2537439413000

  11. 2537439413000

  12. 1683941904

  13. 2537439413000

  14. [2, 2, 3]

L[0] 和 L[1] 同时指向数值2,所以地址相同 (如果是2.0则地址不同)


 

猜你喜欢

转载自blog.csdn.net/Carey_Lu/article/details/82992684