成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

內存中的Python:Python引用計數指南

開發 后端
本文將會為你介紹Python引用計數,演示中使用可變列表對象,不過本文不介紹C語言實現細節。

本文轉載自公眾號“讀芯術”(ID:AI_Discovery)

本文將會為你介紹Python引用計數,演示中使用可變列表對象,不過本文不介紹C語言實現細節。

[[328257]]

需要注意的是,代碼段的輸出在硬件上可能有所不同。

變量是內存引用

Python中的變量是內存引用。如果輸入x = [1,2]時會發生什么?[1,2]是對象。

回想一下,一切都是Python中的對象。[1,2]將在內存中創建。x是[1,2]對象的內存引用。

來看看下面的例子。可以找到x所引用的內存地址。請務必只使用id(x),它會以10為基數,而十六進制函數會將其轉換為十六進制。

 

  1. x = [1, 2] 
  2.    print(hex(id(x)))  # output: 0x32ebea8 

 

內存中的Python:Python引用計數指南

 

 

引用計數

現在已經在內存中創建了一個list對象,而且x對該對象進行了引用。那么y=[1,2]和y=x有什么區別?

當輸入y=[1,2]時,它將在內存中創建一個新的list對象,并且y將引用它。

 

  1. x = [1, 2] 
  2.    y = [1, 2] 
  3.    print(hex(id(x)))  # output: 0x101bea8 
  4.    print(hex(id(y)))  # output: 0x31a5528 

而當輸入y=x時,等同于告訴Python希望y 變量引用x變量引用的內容。因為變量是內存引用的。

可以確認x和y引用同一個對象。

 

  1. x = [1, 2] 
  2.    y = x 
  3.    print(hex(id(x)))  # output: 0x74bea8 
  4.    print(hex(id(y)))  # output: 0x74bea8 

 

內存中的Python:Python引用計數指南

 

 

引用計數的數目

接下來的問題是,有多少變量引用同一個對象?

錯誤的用法:

我看到有些人在使用sys.getrefcount(var)時不知道如何傳遞var,而是向對象添加引用。一起看看下面的例子。

輸出3,而期望的卻是2(x andy)。發生這種情況是因為將x傳遞給getrefcount函數時又添加了一個引用。

 

  1. from sys import getrefcount 
  2.           x = [1, 2] 
  3.           y = x 
  4.           print(hex(id(x)))  # output: 0xb65748 
  5.           print(hex(id(y)))  # output: 0xb65748 
  6.           print(getrefcount(x))  # output: 3 

更好的用法:

可以使用內置的ctypes模塊來找到預期的結果。必須將x的id傳遞給from_address函數。

 

  1. from ctypes import c_long 
  2.       x = [1, 2] 
  3.       y = x 
  4.       print(hex(id(x)))  # output: 0x3395748 
  5.       print(hex(id(y)))  # output: 0x3395748 
  6.       print(c_long.from_address(id(x)).value)  # output: 2 

概言之,錯誤的用法是傳遞變量,而更好的用法則是傳遞變量的id,這意味著只傳遞基數為10的數字,而不是變量。

當對象消失時

當沒有變量引用對象時會發生什么?

對象將從內存中刪除,因為沒有引用該對象的內容。不過也有例外:如果有循環引用,garbage collector 將開始奏效。

為什么使用可變對象

不可變對象由于性能原因,結果可能與預期不同。查看下面的例子,觀察輸出是如何變化的。

 

  1. import sys 
  2.       import ctypes 
  3.              """Some Mutable Objects """ 
  4.       a =list() 
  5.       b =set() 
  6.       c =dict() 
  7.       d =bytearray() 
  8.       """ Some ImmutableObjects """ 
  9.       e =tuple() 
  10.       f =int() 
  11.       g =str() 
  12.       print(sys.getrefcount(a),ctypes.c_long.from_address(id(a)).value)  # output: 2 1 
  13.       print(sys.getrefcount(b),ctypes.c_long.from_address(id(b)).value)  # output: 2 1 
  14.       print(sys.getrefcount(c),ctypes.c_long.from_address(id(c)).value)  # output: 2 1 
  15.       print(sys.getrefcount(d),ctypes.c_long.from_address(id(d)).value)  # output: 2 1 
  16.       print(sys.getrefcount(e),ctypes.c_long.from_address(id(e)).value)  # output: 1298 1297 
  17.       print(sys.getrefcount(f),ctypes.c_long.from_address(id(f)).value)  # output: 209 208 
  18.       print(sys.getrefcount(g),ctypes.c_long.from_address(id(g)).value)  # output: 59 58 

 

文中所談及的一切都對CPython有效。希望對你有幫助。

 

責任編輯:華軒 來源: 讀芯術
相關推薦

2020-11-10 08:45:35

Python

2023-03-26 22:48:46

Python引用計數內存

2017-10-12 12:41:11

PHP圾回收機制變量容器

2010-03-29 09:11:02

Python引用計數

2015-02-01 10:38:47

Linus并行計算

2010-08-19 09:24:41

iPhone

2020-02-09 17:23:17

Python數據字典

2021-05-27 21:47:12

Python垃圾回收

2013-08-21 10:53:46

iOS定義區別

2024-05-13 08:35:27

PyObjectPython對象

2023-10-26 11:19:21

指針Go

2010-03-15 12:36:26

Python列表

2021-08-10 07:27:42

Python引用計數法

2024-07-18 09:07:04

Python窗口操作

2021-06-28 08:00:00

Python開發編程語言

2017-11-15 19:30:08

Python內存泄露循環引用

2017-02-09 21:24:22

iOS內存管理

2011-07-07 09:54:01

Cocoa Core Foundation

2021-12-09 15:45:09

Python弱引用代碼

2021-09-09 17:05:36

C++智能指針語言
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产区在线 | 午夜精品网站 | 久久国产精品久久久久 | av在线天天 | 国产91精品网站 | 久久精品欧美一区二区三区不卡 | 九九看片| 一区欧美| 成人性视频在线 | 精品日韩一区二区三区 | 激情五月婷婷在线 | 在线观看久草 | 一级黄片一级毛片 | 国产免费一区二区三区免费视频 | 一区二区在线看 | 成人在线免费视频 | 在线观看国产三级 | 亚洲综合久久精品 | 日韩免费中文字幕 | www.亚洲一区| 天天拍天天操 | 成人1区| 黄色网毛片 | 欧美精品第一区 | 日韩三区 | 青青久久av北条麻妃海外网 | 成人一区二区三区 | 久草网免费 | 国产精品一区在线观看 | 97精品国产手机 | 国产美女在线精品免费 | 91精品国产欧美一区二区成人 | 亚洲一区二区三区四区五区中文 | 一级做a爰片性色毛片16美国 | 国产精品国产三级国产aⅴ入口 | 成人免费看片 | 中文字幕亚洲区一区二 | 午夜爽爽男女免费观看hd | 国内精品视频在线观看 | 欧美一级在线视频 | 视频二区在线观看 |