diff --git a/README.md b/README.md deleted file mode 100644 index 6dbd6df..0000000 --- a/README.md +++ /dev/null @@ -1,82 +0,0 @@ -# 介绍 - -本项目致力于对 Python 3.7 的源码分析,深度参考陈儒大大的《Python 源码剖析》,编写 Python 3 的版本。 - -希望各位 Python 爱好者能参与其中,一起探索 Python 魔法背后的奥秘! - -# 使用 - -您可以直接访问 [在线版](https://flaggo.github.io/python3-source-code-analysis/),或者根据以下步骤访问本地版。 - -## 前置条件 - -您的系统上需要安装好 node (会自带npm)。 - -## 使用 make 或者使用 npm 命令去构建 - -### 使用 make 命令的方式构建: - -若您可使用 make 命令,简单执行如下命令进行初始化: - -```console -make init -``` - -执行如下命令运行服务端: - -```console -make run -``` - -### 使用 npm 命令的方式构建: - -若您不能使用 make 命令,或想直接使用 npm 命令,执行如下命令进行初始化: - -安装项目依赖: - -```console -npm install -``` - -执行如下命令运行服务端: - -```console -npm run serve -``` - -## 访问 - -直接访问 http://localhost:4000 即可查看本书内容。 - -# Roadmap - -大体按照《Python 源码剖析》中的目录结构进行编写。依次介绍 Python 源码基本信息、内建对象和虚拟机。 - -- [x] 章节 - - [x] 序章 - - [x] 前言 - - [x] Python 源代码的组织 - - [x] Windows 环境下编译 Python - - [x] UNIX/Linux 环境下编译 Python - - [x] 修改 Python 源码 -- [ ] Python 内建对象 - - [x] Python 对象初探 - - [x] Python 整数对象 - - [ ] Python 字符串 对象 - - [x] Python List 对象 - - [x] Python Dict 对象 - - [x] Python Set 对象 - - [ ] 实现简版 Python -- [ ] Python 虚拟机 - - [ ] Python 编译结果 - - [ ] Python 虚拟机框架 - - [ ] 虚拟机一般表达式 - - [ ] Python 虚拟机控制流 - - [ ] Python 虚拟机函数机制 - - [ ] Python 运行环境初始化 - - [ ] Python 模块加载机制 - - [ ] Python 多线程机制 - - [ ] Python 内存管理机制 - - - diff --git a/SUMMARY.md b/SUMMARY.md deleted file mode 100644 index 34ce3ec..0000000 --- a/SUMMARY.md +++ /dev/null @@ -1,21 +0,0 @@ -# 大纲 - -## 第 1 部分:序章 - -- [前言](README.md) -- [Python 源代码的组织](preface/code-organization/index.md) -- [Windows 环境下编译 Python](preface/windows-build/index.md) -- [UNIX/Linux 环境下编译 Python](preface/unix-linux-build/index.md) -- [修改 Python 源码](preface/modify-code/index.md) - -## 第 2 部分:Python 内建对象 - -- [Python 对象初探](objects/object/index.md) -- [Python 整数对象](objects/long-object/index.md) -- [Python 字符串 对象](objects/string-object/index.md) -- [Python List 对象](objects/list-object/index.md) -- [Python Dict 对象](objects/dict-object/index.md) -- [Python Set 对象](objects/set-object/index.md) -- [实现简版 Python](objects/simple-interpreter/index.md) - -## 第 3 部分:Python 虚拟机 diff --git a/book.json b/book.json deleted file mode 100644 index d11f4a2..0000000 --- a/book.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "title": "Python 3 源码分析", - "description": "致力于分析Python 3.7.0 的源码实现", - "author": "Prodesire", - "output.name": "site", - "language": "zh-hans", - "gitbook": "3.2.3", - "root": ".", - "structure": { - "readme": "README.md" - }, - "links": { - "sidebar": { - "主页": "https://github.com/flaggo/python3-source-code-analysis" - } - }, - "plugins": [ - "-search", - "search-plus@^0.0.11", - "-sharing", - "sharing-plus", - "github@^2.0.0", - "github-buttons@2.1.0", - "edit-link@^2.0.2", - "splitter", - "tbfed-pagefooter", - "prism", - "page-toc-button", - "back-to-top-button" - ], - - "pluginsConfig": { - "theme-default": { - "showLevel": true - }, - "github": { - "url": "https://github.com/flaggo/python3-source-code-analysis" - }, - "github-buttons": { - "repo": "flaggo/python3-source-code-analysis", - "types": ["star"], - "size": "small" - }, - "sharing": { - "weibo": true, - "douban": true, - "linkedin": true, - "facebook": true, - "google": true, - "twitter": true, - "all": ["weibo", "douban", "linkedin", "facebook", "google", "twitter"] - }, - "tbfed-pagefooter": { - "copyright": "Copyright © FlagGo 2019", - "modify_label": "该文件修订时间:", - "modify_format": "YYYY-MM-DD HH:mm:ss" - }, - "edit-link": { - "base": "https://github.com/flaggo/python3-source-code-analysis/edit/master", - "label": "编辑此页面" - }, - "anchor-navigation-ex": { - "isRewritePageTitle": false, - "tocLevel1Icon": "fa fa-hand-o-right", - "tocLevel2Icon": "fa fa-hand-o-right", - "tocLevel3Icon": "fa fa-hand-o-right" - }, - "prism": { - "lang": { - "console": "bash", - "shell": "bash" - }, - "css": ["prismjs/themes/prism-okaidia.css"] - } - } -} diff --git a/gitbook/fonts/fontawesome/FontAwesome.otf b/gitbook/fonts/fontawesome/FontAwesome.otf new file mode 100644 index 0000000..d4de13e Binary files /dev/null and b/gitbook/fonts/fontawesome/FontAwesome.otf differ diff --git a/gitbook/fonts/fontawesome/fontawesome-webfont.eot b/gitbook/fonts/fontawesome/fontawesome-webfont.eot new file mode 100644 index 0000000..c7b00d2 Binary files /dev/null and b/gitbook/fonts/fontawesome/fontawesome-webfont.eot differ diff --git a/gitbook/fonts/fontawesome/fontawesome-webfont.svg b/gitbook/fonts/fontawesome/fontawesome-webfont.svg new file mode 100644 index 0000000..8b66187 --- /dev/null +++ b/gitbook/fonts/fontawesome/fontawesome-webfont.svg @@ -0,0 +1,685 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/gitbook/fonts/fontawesome/fontawesome-webfont.ttf b/gitbook/fonts/fontawesome/fontawesome-webfont.ttf new file mode 100644 index 0000000..f221e50 Binary files /dev/null and b/gitbook/fonts/fontawesome/fontawesome-webfont.ttf differ diff --git a/gitbook/fonts/fontawesome/fontawesome-webfont.woff b/gitbook/fonts/fontawesome/fontawesome-webfont.woff new file mode 100644 index 0000000..6e7483c Binary files /dev/null and b/gitbook/fonts/fontawesome/fontawesome-webfont.woff differ diff --git a/gitbook/fonts/fontawesome/fontawesome-webfont.woff2 b/gitbook/fonts/fontawesome/fontawesome-webfont.woff2 new file mode 100644 index 0000000..7eb74fd Binary files /dev/null and b/gitbook/fonts/fontawesome/fontawesome-webfont.woff2 differ diff --git a/gitbook/gitbook-plugin-back-to-top-button/plugin.css b/gitbook/gitbook-plugin-back-to-top-button/plugin.css new file mode 100644 index 0000000..a418cbb --- /dev/null +++ b/gitbook/gitbook-plugin-back-to-top-button/plugin.css @@ -0,0 +1,55 @@ +.back-to-top { + position: fixed; + bottom: 25px; + right: 25px; + background: rgba(0, 0, 0, 0.5); + width: 50px; + height: 50px; + display: block; + text-decoration: none; + -webkit-border-radius: 35px; + -moz-border-radius: 35px; + border-radius: 35px; + display: none; +} +.back-to-top i { + color: #fff; + margin: 0; + position: relative; + left: 15px; + top: 14px; + font-size: 22px; +} +.back-to-top:hover { + background: rgba(0, 0, 0, 0.9); + cursor: pointer; +} +.book.color-theme-1 .back-to-top { + background: rgba(112, 66, 20, 0.5); +} +.book.color-theme-1 .back-to-top i { + color: #f3eacb; +} +.book.color-theme-1 .back-to-top:hover { + background: rgba(112, 66, 20, 0.9); +} +.book.color-theme-2 .back-to-top { + background: rgba(189, 202, 219, 0.5); +} +.book.color-theme-2 .back-to-top i { + color: #1C1F2B; +} +.book.color-theme-2 .back-to-top:hover { + background: rgba(189, 202, 219, 0.9); +} + +@media only screen + and (min-device-width: 320px) + and (max-device-width: 480px) + and (-webkit-min-device-pixel-ratio: 2) + and (orientation: portrait) { + .back-to-top { + bottom: 10px; + right: 10px; + } +} \ No newline at end of file diff --git a/gitbook/gitbook-plugin-back-to-top-button/plugin.js b/gitbook/gitbook-plugin-back-to-top-button/plugin.js new file mode 100644 index 0000000..abd3523 --- /dev/null +++ b/gitbook/gitbook-plugin-back-to-top-button/plugin.js @@ -0,0 +1,25 @@ +var gitbook = window.gitbook; + +gitbook.events.on('page.change', function() { + + var back_to_top_button = ['
'].join(""); + $(".book").append(back_to_top_button) + + $(".back-to-top").hide(); + + $('.book-body,.body-inner').on('scroll', function () { + if ($(this).scrollTop() > 100) { + $('.back-to-top').fadeIn(); + } else { + $('.back-to-top').fadeOut(); + } + }); + + $('.back-to-top').click(function () { + $('.book-body,.body-inner').animate({ + scrollTop: 0 + }, 800); + return false; + }); + +}); diff --git a/gitbook/gitbook-plugin-edit-link/plugin.js b/gitbook/gitbook-plugin-edit-link/plugin.js new file mode 100644 index 0000000..32f3494 --- /dev/null +++ b/gitbook/gitbook-plugin-edit-link/plugin.js @@ -0,0 +1,30 @@ +require(["gitbook", "jQuery"], function(gitbook, $) { + gitbook.events.bind('start', function (e, config) { + var conf = config['edit-link']; + var label = conf.label; + var base = conf.base; + var lang = gitbook.state.innerLanguage; + if (lang) { + // label can be a unique string for multi-languages site + if (typeof label === 'object') label = label[lang]; + + lang = lang + '/'; + } + + // Add slash at the end if not present + if (base.slice(-1) != "/") { + base = base + "/"; + } + + gitbook.toolbar.createButton({ + icon: 'fa fa-edit', + text: label, + onClick: function() { + var filepath = gitbook.state.filepath; + + window.open(base + lang + filepath); + } + }); + }); + +}); \ No newline at end of file diff --git a/gitbook/gitbook-plugin-fontsettings/buttons.js b/gitbook/gitbook-plugin-fontsettings/buttons.js new file mode 100644 index 0000000..4fa4c61 --- /dev/null +++ b/gitbook/gitbook-plugin-fontsettings/buttons.js @@ -0,0 +1,151 @@ +require(["gitbook", "lodash", "jQuery"], function(gitbook, _, $) { + var fontState; + + var THEMES = { + "white": 0, + "sepia": 1, + "night": 2 + }; + + var FAMILY = { + "serif": 0, + "sans": 1 + }; + + // Save current font settings + function saveFontSettings() { + gitbook.storage.set("fontState", fontState); + update(); + } + + // Increase font size + function enlargeFontSize(e) { + e.preventDefault(); + if (fontState.size >= 4) return; + + fontState.size++; + saveFontSettings(); + }; + + // Decrease font size + function reduceFontSize(e) { + e.preventDefault(); + if (fontState.size <= 0) return; + + fontState.size--; + saveFontSettings(); + }; + + // Change font family + function changeFontFamily(index, e) { + e.preventDefault(); + + fontState.family = index; + saveFontSettings(); + }; + + // Change type of color + function changeColorTheme(index, e) { + e.preventDefault(); + + var $book = $(".book"); + + if (fontState.theme !== 0) + $book.removeClass("color-theme-"+fontState.theme); + + fontState.theme = index; + if (fontState.theme !== 0) + $book.addClass("color-theme-"+fontState.theme); + + saveFontSettings(); + }; + + function update() { + var $book = gitbook.state.$book; + + $(".font-settings .font-family-list li").removeClass("active"); + $(".font-settings .font-family-list li:nth-child("+(fontState.family+1)+")").addClass("active"); + + $book[0].className = $book[0].className.replace(/\bfont-\S+/g, ''); + $book.addClass("font-size-"+fontState.size); + $book.addClass("font-family-"+fontState.family); + + if(fontState.theme !== 0) { + $book[0].className = $book[0].className.replace(/\bcolor-theme-\S+/g, ''); + $book.addClass("color-theme-"+fontState.theme); + } + }; + + function init(config) { + var $bookBody, $book; + + //Find DOM elements. + $book = gitbook.state.$book; + $bookBody = $book.find(".book-body"); + + // Instantiate font state object + fontState = gitbook.storage.get("fontState", { + size: config.size || 2, + family: FAMILY[config.family || "sans"], + theme: THEMES[config.theme || "white"] + }); + + update(); + }; + + + gitbook.events.bind("start", function(e, config) { + var opts = config.fontsettings; + + // Create buttons in toolbar + gitbook.toolbar.createButton({ + icon: 'fa fa-font', + label: 'Font Settings', + className: 'font-settings', + dropdown: [ + [ + { + text: 'A', + className: 'font-reduce', + onClick: reduceFontSize + }, + { + text: 'A', + className: 'font-enlarge', + onClick: enlargeFontSize + } + ], + [ + { + text: 'Serif', + onClick: _.partial(changeFontFamily, 0) + }, + { + text: 'Sans', + onClick: _.partial(changeFontFamily, 1) + } + ], + [ + { + text: 'White', + onClick: _.partial(changeColorTheme, 0) + }, + { + text: 'Sepia', + onClick: _.partial(changeColorTheme, 1) + }, + { + text: 'Night', + onClick: _.partial(changeColorTheme, 2) + } + ] + ] + }); + + + // Init current settings + init(opts); + }); +}); + + diff --git a/gitbook/gitbook-plugin-fontsettings/website.css b/gitbook/gitbook-plugin-fontsettings/website.css new file mode 100644 index 0000000..26591fe --- /dev/null +++ b/gitbook/gitbook-plugin-fontsettings/website.css @@ -0,0 +1,291 @@ +/* + * Theme 1 + */ +.color-theme-1 .dropdown-menu { + background-color: #111111; + border-color: #7e888b; +} +.color-theme-1 .dropdown-menu .dropdown-caret .caret-inner { + border-bottom: 9px solid #111111; +} +.color-theme-1 .dropdown-menu .buttons { + border-color: #7e888b; +} +.color-theme-1 .dropdown-menu .button { + color: #afa790; +} +.color-theme-1 .dropdown-menu .button:hover { + color: #73553c; +} +/* + * Theme 2 + */ +.color-theme-2 .dropdown-menu { + background-color: #2d3143; + border-color: #272a3a; +} +.color-theme-2 .dropdown-menu .dropdown-caret .caret-inner { + border-bottom: 9px solid #2d3143; +} +.color-theme-2 .dropdown-menu .buttons { + border-color: #272a3a; +} +.color-theme-2 .dropdown-menu .button { + color: #62677f; +} +.color-theme-2 .dropdown-menu .button:hover { + color: #f4f4f5; +} +.book .book-header .font-settings .font-enlarge { + line-height: 30px; + font-size: 1.4em; +} +.book .book-header .font-settings .font-reduce { + line-height: 30px; + font-size: 1em; +} +.book.color-theme-1 .book-body { + color: #704214; + background: #f3eacb; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section { + background: #f3eacb; +} +.book.color-theme-2 .book-body { + color: #bdcadb; + background: #1c1f2b; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section { + background: #1c1f2b; +} +.book.font-size-0 .book-body .page-inner section { + font-size: 1.2rem; +} +.book.font-size-1 .book-body .page-inner section { + font-size: 1.4rem; +} +.book.font-size-2 .book-body .page-inner section { + font-size: 1.6rem; +} +.book.font-size-3 .book-body .page-inner section { + font-size: 2.2rem; +} +.book.font-size-4 .book-body .page-inner section { + font-size: 4rem; +} +.book.font-family-0 { + font-family: Georgia, serif; +} +.book.font-family-1 { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal { + color: #704214; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal a { + color: inherit; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h1, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h2, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h3, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h4, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h5, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h6 { + color: inherit; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h1, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h2 { + border-color: inherit; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal h6 { + color: inherit; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal hr { + background-color: inherit; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal blockquote { + border-color: inherit; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code { + background: #fdf6e3; + color: #657b83; + border-color: #f8df9c; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal .highlight { + background-color: inherit; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal table th, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal table td { + border-color: #f5d06c; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal table tr { + color: inherit; + background-color: #fdf6e3; + border-color: #444444; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal table tr:nth-child(2n) { + background-color: #fbeecb; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal { + color: #bdcadb; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal a { + color: #3eb1d0; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h1, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h2, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h3, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h4, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h5, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h6 { + color: #fffffa; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h1, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h2 { + border-color: #373b4e; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal h6 { + color: #373b4e; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal hr { + background-color: #373b4e; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal blockquote { + border-color: #373b4e; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code { + color: #9dbed8; + background: #2d3143; + border-color: #2d3143; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal .highlight { + background-color: #282a39; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal table th, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal table td { + border-color: #3b3f54; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal table tr { + color: #b6c2d2; + background-color: #2d3143; + border-color: #3b3f54; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal table tr:nth-child(2n) { + background-color: #35394b; +} +.book.color-theme-1 .book-header { + color: #afa790; + background: transparent; +} +.book.color-theme-1 .book-header .btn { + color: #afa790; +} +.book.color-theme-1 .book-header .btn:hover { + color: #73553c; + background: none; +} +.book.color-theme-1 .book-header h1 { + color: #704214; +} +.book.color-theme-2 .book-header { + color: #7e888b; + background: transparent; +} +.book.color-theme-2 .book-header .btn { + color: #3b3f54; +} +.book.color-theme-2 .book-header .btn:hover { + color: #fffff5; + background: none; +} +.book.color-theme-2 .book-header h1 { + color: #bdcadb; +} +.book.color-theme-1 .book-body .navigation { + color: #afa790; +} +.book.color-theme-1 .book-body .navigation:hover { + color: #73553c; +} +.book.color-theme-2 .book-body .navigation { + color: #383f52; +} +.book.color-theme-2 .book-body .navigation:hover { + color: #fffff5; +} +/* + * Theme 1 + */ +.book.color-theme-1 .book-summary { + color: #afa790; + background: #111111; + border-right: 1px solid rgba(0, 0, 0, 0.07); +} +.book.color-theme-1 .book-summary .book-search { + background: transparent; +} +.book.color-theme-1 .book-summary .book-search input, +.book.color-theme-1 .book-summary .book-search input:focus { + border: 1px solid transparent; +} +.book.color-theme-1 .book-summary ul.summary li.divider { + background: #7e888b; + box-shadow: none; +} +.book.color-theme-1 .book-summary ul.summary li i.fa-check { + color: #33cc33; +} +.book.color-theme-1 .book-summary ul.summary li.done > a { + color: #877f6a; +} +.book.color-theme-1 .book-summary ul.summary li a, +.book.color-theme-1 .book-summary ul.summary li span { + color: #877f6a; + background: transparent; + font-weight: normal; +} +.book.color-theme-1 .book-summary ul.summary li.active > a, +.book.color-theme-1 .book-summary ul.summary li a:hover { + color: #704214; + background: transparent; + font-weight: normal; +} +/* + * Theme 2 + */ +.book.color-theme-2 .book-summary { + color: #bcc1d2; + background: #2d3143; + border-right: none; +} +.book.color-theme-2 .book-summary .book-search { + background: transparent; +} +.book.color-theme-2 .book-summary .book-search input, +.book.color-theme-2 .book-summary .book-search input:focus { + border: 1px solid transparent; +} +.book.color-theme-2 .book-summary ul.summary li.divider { + background: #272a3a; + box-shadow: none; +} +.book.color-theme-2 .book-summary ul.summary li i.fa-check { + color: #33cc33; +} +.book.color-theme-2 .book-summary ul.summary li.done > a { + color: #62687f; +} +.book.color-theme-2 .book-summary ul.summary li a, +.book.color-theme-2 .book-summary ul.summary li span { + color: #c1c6d7; + background: transparent; + font-weight: 600; +} +.book.color-theme-2 .book-summary ul.summary li.active > a, +.book.color-theme-2 .book-summary ul.summary li a:hover { + color: #f4f4f5; + background: #252737; + font-weight: 600; +} diff --git a/gitbook/gitbook-plugin-github-buttons/plugin.js b/gitbook/gitbook-plugin-github-buttons/plugin.js new file mode 100644 index 0000000..819d319 --- /dev/null +++ b/gitbook/gitbook-plugin-github-buttons/plugin.js @@ -0,0 +1,91 @@ +// LICENSE : MIT +"use strict"; + +var _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })(); + +require(['gitbook'], function (gitbook) { + function addBeforeHeader(element) { + jQuery('.book-header > h1').before(element); + } + + function createButton(_ref) { + var user = _ref.user; + var repo = _ref.repo; + var type = _ref.type; + var size = _ref.size; + var width = _ref.width; + var height = _ref.height; + var count = _ref.count; + + var extraParam = type === "watch" ? "&v=2" : ""; + return '\n \n '; + } + + function insertGitHubLink(_ref2) { + var user = _ref2.user; + var repo = _ref2.repo; + var types = _ref2.types; + var size = _ref2.size; + var width = _ref2.width; + var height = _ref2.height; + var count = _ref2.count; + + types.reverse().forEach(function (type) { + var elementString = createButton({ + user: user, + repo: repo, + type: type, + size: size, + width: width, + height: height, + count: count + }); + addBeforeHeader(elementString); + }); + } + + function init(config) { + var repoPath = config.repo; + + var _repoPath$split = repoPath.split("/"); + + var _repoPath$split2 = _slicedToArray(_repoPath$split, 2); + + var user = _repoPath$split2[0]; + var repo = _repoPath$split2[1]; + + if (repoPath == null) { + console.log("Should set github.repo"); + return; + } + var types = config.types || ["star", "watch"]; + var size = config.size || "large"; + var width = config.width || (size === "large" ? "150" : "100"); + var height = config.height || (size === "large" ? "30" : "20"); + var count = typeof config.count === "undefined" ? "true" : "false"; + insertGitHubLink({ + user: user, + repo: repo, + types: types, + size: size, + width: width, + height: height, + count: count + }); + } + + // injected by html hook + function getPluginConfig() { + return window["gitbook-plugin-github-buttons"]; + } + + // make sure configuration gets injected + gitbook.events.bind('start', function (e, config) { + window["gitbook-plugin-github-buttons"] = config["github-buttons"]; + }); + + gitbook.events.bind('page.change', function () { + init(getPluginConfig()); + }); +}); +//# sourceMappingURL=plugin.js.map \ No newline at end of file diff --git a/gitbook/gitbook-plugin-github-buttons/plugin.js.map b/gitbook/gitbook-plugin-github-buttons/plugin.js.map new file mode 100644 index 0000000..a46db50 --- /dev/null +++ b/gitbook/gitbook-plugin-github-buttons/plugin.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/plugin.js"],"names":[],"mappings":";AACA,YAAY,CAAC;;;;AACb,OAAO,CAAC,CAAC,SAAS,CAAC,EAAE,UAAU,OAAO,EAAE;AACpC,aAAS,eAAe,CAAC,OAAO,EAAE;AAC9B,cAAM,CAAC,mBAAmB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;KAC9C;;AAED,aAAS,YAAY,CAAC,IAQjB,EAAE;YAPH,IAAI,GADc,IAQjB,CAPD,IAAI;YACJ,IAAI,GAFc,IAQjB,CAND,IAAI;YACJ,IAAI,GAHc,IAQjB,CALD,IAAI;YACJ,IAAI,GAJc,IAQjB,CAJD,IAAI;YACJ,KAAK,GALa,IAQjB,CAHD,KAAK;YACL,MAAM,GANY,IAQjB,CAFD,MAAM;YACN,KAAK,GAPa,IAQjB,CADD,KAAK;;AAEL,YAAI,UAAU,GAAG,IAAI,KAAK,OAAO,GAAG,MAAM,GAAG,EAAE,CAAC;AAChD,mMAC2G,IAAI,cAAS,IAAI,cAAS,IAAI,eAAU,KAAK,cAAS,IAAI,GAAG,UAAU,+CAA0C,KAAK,oBAAe,MAAM,iCAChP;KACT;;AAGD,aAAS,gBAAgB,CAAC,KAQrB,EAAE;YAPH,IAAI,GADkB,KAQrB,CAPD,IAAI;YACJ,IAAI,GAFkB,KAQrB,CAND,IAAI;YACJ,KAAK,GAHiB,KAQrB,CALD,KAAK;YACL,IAAI,GAJkB,KAQrB,CAJD,IAAI;YACJ,KAAK,GALiB,KAQrB,CAHD,KAAK;YACL,MAAM,GANgB,KAQrB,CAFD,MAAM;YACN,KAAK,GAPiB,KAQrB,CADD,KAAK;;AAEL,aAAK,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,UAAA,IAAI,EAAI;AAC5B,gBAAI,aAAa,GAAG,YAAY,CAAC;AAC7B,oBAAI,EAAJ,IAAI;AACJ,oBAAI,EAAJ,IAAI;AACJ,oBAAI,EAAJ,IAAI;AACJ,oBAAI,EAAJ,IAAI;AACJ,qBAAK,EAAL,KAAK;AACL,sBAAM,EAAN,MAAM;AACN,qBAAK,EAAL,KAAK;aACR,CAAC,CAAC;AACH,2BAAe,CAAC,aAAa,CAAC,CAAC;SAClC,CAAC,CAAC;KACN;;AAED,aAAS,IAAI,CAAC,MAAM,EAAE;AAClB,YAAI,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC;;8BACR,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC;;;;YAAjC,IAAI;YAAE,IAAI;;AACf,YAAI,QAAQ,IAAI,IAAI,EAAE;AAClB,mBAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;AACtC,mBAAO;SACV;AACD,YAAI,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC9C,YAAI,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,OAAO,CAAC;AAClC,YAAI,KAAK,GAAG,MAAM,CAAC,KAAK,KAAK,IAAI,KAAK,OAAO,GAAG,KAAK,GAAG,KAAK,CAAA,AAAC,CAAC;AAC/D,YAAI,MAAM,GAAG,MAAM,CAAC,MAAM,KAAK,IAAI,KAAK,OAAO,GAAG,IAAI,GAAG,IAAI,CAAA,AAAC,CAAC;AAC/D,YAAI,KAAK,GAAG,OAAO,MAAM,CAAC,KAAK,KAAK,WAAW,GAAG,MAAM,GAAG,OAAO,CAAC;AACnE,wBAAgB,CAAC;AACb,gBAAI,EAAJ,IAAI;AACJ,gBAAI,EAAJ,IAAI;AACJ,iBAAK,EAAL,KAAK;AACL,gBAAI,EAAJ,IAAI;AACJ,iBAAK,EAAL,KAAK;AACL,kBAAM,EAAN,MAAM;AACN,iBAAK,EAAL,KAAK;SACR,CAAC,CAAC;KACN;;;AAGD,aAAS,eAAe,GAAG;AACvB,eAAO,MAAM,CAAC,+BAA+B,CAAC,CAAC;KAClD;;;AAGD,WAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE;AAC9C,cAAM,CAAC,+BAA+B,CAAC,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;KACtE,CAAC,CAAC;;AAEH,WAAO,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,YAAY;AAC3C,YAAI,CAAC,eAAe,EAAE,CAAC,CAAC;KAC3B,CAAC,CAAC;CACN,CAAC,CAAC","file":"plugin.js","sourcesContent":["// LICENSE : MIT\n\"use strict\";\nrequire(['gitbook'], function (gitbook) {\n function addBeforeHeader(element) {\n jQuery('.book-header > h1').before(element)\n }\n\n function createButton({\n user,\n repo,\n type,\n size,\n width,\n height,\n count\n }) {\n var extraParam = type === \"watch\" ? \"&v=2\" : \"\";\n return `\n \n `;\n }\n\n\n function insertGitHubLink({\n user,\n repo,\n types,\n size,\n width,\n height,\n count\n }) {\n types.reverse().forEach(type => {\n var elementString = createButton({\n user,\n repo,\n type,\n size,\n width,\n height,\n count\n });\n addBeforeHeader(elementString);\n });\n }\n\n function init(config) {\n var repoPath = config.repo;\n var [user, repo] = repoPath.split(\"/\");\n if (repoPath == null) {\n console.log(\"Should set github.repo\");\n return;\n }\n var types = config.types || [\"star\", \"watch\"];\n var size = config.size || \"large\";\n var width = config.width || (size === \"large\" ? \"150\" : \"100\");\n var height = config.height || (size === \"large\" ? \"30\" : \"20\");\n var count = typeof config.count === \"undefined\" ? \"true\" : \"false\";\n insertGitHubLink({\n user,\n repo,\n types,\n size,\n width,\n height,\n count\n });\n }\n\n // injected by html hook\n function getPluginConfig() {\n return window[\"gitbook-plugin-github-buttons\"];\n }\n\n // make sure configuration gets injected\n gitbook.events.bind('start', function (e, config) {\n window[\"gitbook-plugin-github-buttons\"] = config[\"github-buttons\"];\n });\n\n gitbook.events.bind('page.change', function () {\n init(getPluginConfig());\n });\n});\n"]} \ No newline at end of file diff --git a/gitbook/gitbook-plugin-github/plugin.js b/gitbook/gitbook-plugin-github/plugin.js new file mode 100644 index 0000000..14810ce --- /dev/null +++ b/gitbook/gitbook-plugin-github/plugin.js @@ -0,0 +1,14 @@ +require([ 'gitbook' ], function (gitbook) { + gitbook.events.bind('start', function (e, config) { + var githubURL = config.github.url; + + gitbook.toolbar.createButton({ + icon: 'fa fa-github', + label: 'GitHub', + position: 'right', + onClick: function() { + window.open(githubURL) + } + }); + }); +}); diff --git a/gitbook/gitbook-plugin-highlight/ebook.css b/gitbook/gitbook-plugin-highlight/ebook.css new file mode 100644 index 0000000..3779bae --- /dev/null +++ b/gitbook/gitbook-plugin-highlight/ebook.css @@ -0,0 +1,131 @@ +pre, +code { + /* http://jmblog.github.io/color-themes-for-highlightjs */ + /* Tomorrow Comment */ + /* Tomorrow Red */ + /* Tomorrow Orange */ + /* Tomorrow Yellow */ + /* Tomorrow Green */ + /* Tomorrow Aqua */ + /* Tomorrow Blue */ + /* Tomorrow Purple */ +} +pre .hljs-comment, +code .hljs-comment, +pre .hljs-title, +code .hljs-title { + color: #8e908c; +} +pre .hljs-variable, +code .hljs-variable, +pre .hljs-attribute, +code .hljs-attribute, +pre .hljs-tag, +code .hljs-tag, +pre .hljs-regexp, +code .hljs-regexp, +pre .ruby .hljs-constant, +code .ruby .hljs-constant, +pre .xml .hljs-tag .hljs-title, +code .xml .hljs-tag .hljs-title, +pre .xml .hljs-pi, +code .xml .hljs-pi, +pre .xml .hljs-doctype, +code .xml .hljs-doctype, +pre .html .hljs-doctype, +code .html .hljs-doctype, +pre .css .hljs-id, +code .css .hljs-id, +pre .css .hljs-class, +code .css .hljs-class, +pre .css .hljs-pseudo, +code .css .hljs-pseudo { + color: #c82829; +} +pre .hljs-number, +code .hljs-number, +pre .hljs-preprocessor, +code .hljs-preprocessor, +pre .hljs-pragma, +code .hljs-pragma, +pre .hljs-built_in, +code .hljs-built_in, +pre .hljs-literal, +code .hljs-literal, +pre .hljs-params, +code .hljs-params, +pre .hljs-constant, +code .hljs-constant { + color: #f5871f; +} +pre .ruby .hljs-class .hljs-title, +code .ruby .hljs-class .hljs-title, +pre .css .hljs-rules .hljs-attribute, +code .css .hljs-rules .hljs-attribute { + color: #eab700; +} +pre .hljs-string, +code .hljs-string, +pre .hljs-value, +code .hljs-value, +pre .hljs-inheritance, +code .hljs-inheritance, +pre .hljs-header, +code .hljs-header, +pre .ruby .hljs-symbol, +code .ruby .hljs-symbol, +pre .xml .hljs-cdata, +code .xml .hljs-cdata { + color: #718c00; +} +pre .css .hljs-hexcolor, +code .css .hljs-hexcolor { + color: #3e999f; +} +pre .hljs-function, +code .hljs-function, +pre .python .hljs-decorator, +code .python .hljs-decorator, +pre .python .hljs-title, +code .python .hljs-title, +pre .ruby .hljs-function .hljs-title, +code .ruby .hljs-function .hljs-title, +pre .ruby .hljs-title .hljs-keyword, +code .ruby .hljs-title .hljs-keyword, +pre .perl .hljs-sub, +code .perl .hljs-sub, +pre .javascript .hljs-title, +code .javascript .hljs-title, +pre .coffeescript .hljs-title, +code .coffeescript .hljs-title { + color: #4271ae; +} +pre .hljs-keyword, +code .hljs-keyword, +pre .javascript .hljs-function, +code .javascript .hljs-function { + color: #8959a8; +} +pre .hljs, +code .hljs { + display: block; + background: white; + color: #4d4d4c; + padding: 0.5em; +} +pre .coffeescript .javascript, +code .coffeescript .javascript, +pre .javascript .xml, +code .javascript .xml, +pre .tex .hljs-formula, +code .tex .hljs-formula, +pre .xml .javascript, +code .xml .javascript, +pre .xml .vbscript, +code .xml .vbscript, +pre .xml .css, +code .xml .css, +pre .xml .hljs-cdata, +code .xml .hljs-cdata { + opacity: 0.5; +} diff --git a/gitbook/gitbook-plugin-highlight/website.css b/gitbook/gitbook-plugin-highlight/website.css new file mode 100644 index 0000000..2aabd3d --- /dev/null +++ b/gitbook/gitbook-plugin-highlight/website.css @@ -0,0 +1,426 @@ +.book .book-body .page-wrapper .page-inner section.normal pre, +.book .book-body .page-wrapper .page-inner section.normal code { + /* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ + /* Tomorrow Comment */ + /* Tomorrow Red */ + /* Tomorrow Orange */ + /* Tomorrow Yellow */ + /* Tomorrow Green */ + /* Tomorrow Aqua */ + /* Tomorrow Blue */ + /* Tomorrow Purple */ +} +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-comment, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-comment, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-title { + color: #8e908c; +} +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-variable, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-variable, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-attribute, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-attribute, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-tag, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-tag, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-regexp, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-regexp, +.book .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-constant, +.book .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-constant, +.book .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-tag .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal code .xml .hljs-tag .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-pi, +.book .book-body .page-wrapper .page-inner section.normal code .xml .hljs-pi, +.book .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-doctype, +.book .book-body .page-wrapper .page-inner section.normal code .xml .hljs-doctype, +.book .book-body .page-wrapper .page-inner section.normal pre .html .hljs-doctype, +.book .book-body .page-wrapper .page-inner section.normal code .html .hljs-doctype, +.book .book-body .page-wrapper .page-inner section.normal pre .css .hljs-id, +.book .book-body .page-wrapper .page-inner section.normal code .css .hljs-id, +.book .book-body .page-wrapper .page-inner section.normal pre .css .hljs-class, +.book .book-body .page-wrapper .page-inner section.normal code .css .hljs-class, +.book .book-body .page-wrapper .page-inner section.normal pre .css .hljs-pseudo, +.book .book-body .page-wrapper .page-inner section.normal code .css .hljs-pseudo { + color: #c82829; +} +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-number, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-number, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-preprocessor, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-preprocessor, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-pragma, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-pragma, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-built_in, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-built_in, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-literal, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-literal, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-params, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-params, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-constant, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-constant { + color: #f5871f; +} +.book .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-class .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-class .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal pre .css .hljs-rules .hljs-attribute, +.book .book-body .page-wrapper .page-inner section.normal code .css .hljs-rules .hljs-attribute { + color: #eab700; +} +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-string, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-string, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-value, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-value, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-inheritance, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-inheritance, +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-header, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-header, +.book .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-symbol, +.book .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-symbol, +.book .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-cdata, +.book .book-body .page-wrapper .page-inner section.normal code .xml .hljs-cdata { + color: #718c00; +} +.book .book-body .page-wrapper .page-inner section.normal pre .css .hljs-hexcolor, +.book .book-body .page-wrapper .page-inner section.normal code .css .hljs-hexcolor { + color: #3e999f; +} +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-function, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-function, +.book .book-body .page-wrapper .page-inner section.normal pre .python .hljs-decorator, +.book .book-body .page-wrapper .page-inner section.normal code .python .hljs-decorator, +.book .book-body .page-wrapper .page-inner section.normal pre .python .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal code .python .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-function .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-function .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-title .hljs-keyword, +.book .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-title .hljs-keyword, +.book .book-body .page-wrapper .page-inner section.normal pre .perl .hljs-sub, +.book .book-body .page-wrapper .page-inner section.normal code .perl .hljs-sub, +.book .book-body .page-wrapper .page-inner section.normal pre .javascript .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal code .javascript .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal pre .coffeescript .hljs-title, +.book .book-body .page-wrapper .page-inner section.normal code .coffeescript .hljs-title { + color: #4271ae; +} +.book .book-body .page-wrapper .page-inner section.normal pre .hljs-keyword, +.book .book-body .page-wrapper .page-inner section.normal code .hljs-keyword, +.book .book-body .page-wrapper .page-inner section.normal pre .javascript .hljs-function, +.book .book-body .page-wrapper .page-inner section.normal code .javascript .hljs-function { + color: #8959a8; +} +.book .book-body .page-wrapper .page-inner section.normal pre .hljs, +.book .book-body .page-wrapper .page-inner section.normal code .hljs { + display: block; + background: white; + color: #4d4d4c; + padding: 0.5em; +} +.book .book-body .page-wrapper .page-inner section.normal pre .coffeescript .javascript, +.book .book-body .page-wrapper .page-inner section.normal code .coffeescript .javascript, +.book .book-body .page-wrapper .page-inner section.normal pre .javascript .xml, +.book .book-body .page-wrapper .page-inner section.normal code .javascript .xml, +.book .book-body .page-wrapper .page-inner section.normal pre .tex .hljs-formula, +.book .book-body .page-wrapper .page-inner section.normal code .tex .hljs-formula, +.book .book-body .page-wrapper .page-inner section.normal pre .xml .javascript, +.book .book-body .page-wrapper .page-inner section.normal code .xml .javascript, +.book .book-body .page-wrapper .page-inner section.normal pre .xml .vbscript, +.book .book-body .page-wrapper .page-inner section.normal code .xml .vbscript, +.book .book-body .page-wrapper .page-inner section.normal pre .xml .css, +.book .book-body .page-wrapper .page-inner section.normal code .xml .css, +.book .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-cdata, +.book .book-body .page-wrapper .page-inner section.normal code .xml .hljs-cdata { + opacity: 0.5; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code { + /* + +Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull + +*/ + /* Solarized Green */ + /* Solarized Cyan */ + /* Solarized Blue */ + /* Solarized Yellow */ + /* Solarized Orange */ + /* Solarized Red */ + /* Solarized Violet */ +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs { + display: block; + padding: 0.5em; + background: #fdf6e3; + color: #657b83; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-comment, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-comment, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-template_comment, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-template_comment, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .diff .hljs-header, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .diff .hljs-header, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-doctype, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-doctype, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-pi, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-pi, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .lisp .hljs-string, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .lisp .hljs-string, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-javadoc, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-javadoc { + color: #93a1a1; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-keyword, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-keyword, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-winutils, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-winutils, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .method, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .method, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-addition, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-addition, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-tag, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .css .hljs-tag, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-request, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-request, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-status, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-status, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .nginx .hljs-title, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .nginx .hljs-title { + color: #859900; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-number, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-number, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-command, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-command, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-string, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-string, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-tag .hljs-value, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-tag .hljs-value, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-rules .hljs-value, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-rules .hljs-value, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-phpdoc, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-phpdoc, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .tex .hljs-formula, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .tex .hljs-formula, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-regexp, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-regexp, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-hexcolor, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-hexcolor, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-link_url, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-link_url { + color: #2aa198; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-title, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-title, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-localvars, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-localvars, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-chunk, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-chunk, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-decorator, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-decorator, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-built_in, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-built_in, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-identifier, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-identifier, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .vhdl .hljs-literal, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .vhdl .hljs-literal, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-id, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-id, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-function, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .css .hljs-function { + color: #268bd2; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-attribute, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-attribute, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-variable, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-variable, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .lisp .hljs-body, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .lisp .hljs-body, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .smalltalk .hljs-number, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .smalltalk .hljs-number, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-constant, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-constant, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-class .hljs-title, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-class .hljs-title, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-parent, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-parent, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .haskell .hljs-type, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .haskell .hljs-type, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-link_reference, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-link_reference { + color: #b58900; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-preprocessor, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-preprocessor, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-preprocessor .hljs-keyword, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-preprocessor .hljs-keyword, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-pragma, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-pragma, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-shebang, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-shebang, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-symbol, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-symbol, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-symbol .hljs-string, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-symbol .hljs-string, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .diff .hljs-change, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .diff .hljs-change, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-special, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-special, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-attr_selector, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-attr_selector, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-subst, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-subst, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-cdata, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-cdata, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .clojure .hljs-title, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .clojure .hljs-title, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-pseudo, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .css .hljs-pseudo, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-header, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-header { + color: #cb4b16; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-deletion, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-deletion, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-important, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-important { + color: #dc322f; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-link_label, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-link_label { + color: #6c71c4; +} +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .tex .hljs-formula, +.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .tex .hljs-formula { + background: #eee8d5; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code { + /* Tomorrow Night Bright Theme */ + /* Original theme - https://github.com/chriskempson/tomorrow-theme */ + /* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ + /* Tomorrow Comment */ + /* Tomorrow Red */ + /* Tomorrow Orange */ + /* Tomorrow Yellow */ + /* Tomorrow Green */ + /* Tomorrow Aqua */ + /* Tomorrow Blue */ + /* Tomorrow Purple */ +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-comment, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-comment, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-title { + color: #969896; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-variable, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-variable, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-attribute, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-attribute, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-tag, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-tag, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-regexp, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-regexp, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-constant, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-constant, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-tag .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .hljs-tag .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-pi, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .hljs-pi, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-doctype, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .hljs-doctype, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .html .hljs-doctype, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .html .hljs-doctype, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-id, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .css .hljs-id, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-class, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .css .hljs-class, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-pseudo, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .css .hljs-pseudo { + color: #d54e53; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-number, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-number, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-preprocessor, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-preprocessor, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-pragma, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-pragma, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-built_in, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-built_in, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-literal, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-literal, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-params, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-params, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-constant, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-constant { + color: #e78c45; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-class .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-class .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-rules .hljs-attribute, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .css .hljs-rules .hljs-attribute { + color: #e7c547; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-string, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-string, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-value, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-value, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-inheritance, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-inheritance, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-header, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-header, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-symbol, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-symbol, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-cdata, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .hljs-cdata { + color: #b9ca4a; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .css .hljs-hexcolor, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .css .hljs-hexcolor { + color: #70c0b1; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-function, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-function, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .python .hljs-decorator, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .python .hljs-decorator, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .python .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .python .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-function .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-function .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-title .hljs-keyword, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-title .hljs-keyword, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .perl .hljs-sub, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .perl .hljs-sub, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .javascript .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .javascript .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .coffeescript .hljs-title, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .coffeescript .hljs-title { + color: #7aa6da; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-keyword, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-keyword, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .javascript .hljs-function, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .javascript .hljs-function { + color: #c397d8; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs { + display: block; + background: black; + color: #eaeaea; + padding: 0.5em; +} +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .coffeescript .javascript, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .coffeescript .javascript, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .javascript .xml, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .javascript .xml, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .tex .hljs-formula, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .tex .hljs-formula, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .javascript, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .javascript, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .vbscript, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .vbscript, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .css, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .css, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .xml .hljs-cdata, +.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .xml .hljs-cdata { + opacity: 0.5; +} diff --git a/gitbook/gitbook-plugin-lunr/lunr.min.js b/gitbook/gitbook-plugin-lunr/lunr.min.js new file mode 100644 index 0000000..6aa6bc7 --- /dev/null +++ b/gitbook/gitbook-plugin-lunr/lunr.min.js @@ -0,0 +1,7 @@ +/** + * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 0.5.12 + * Copyright (C) 2015 Oliver Nightingale + * MIT Licensed + * @license + */ +!function(){var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.5.12",t.utils={},t.utils.warn=function(t){return function(e){t.console&&console.warn&&console.warn(e)}}(this),t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var t=Array.prototype.slice.call(arguments),e=t.pop(),n=t;if("function"!=typeof e)throw new TypeError("last argument must be a function");n.forEach(function(t){this.hasHandler(t)||(this.events[t]=[]),this.events[t].push(e)},this)},t.EventEmitter.prototype.removeListener=function(t,e){if(this.hasHandler(t)){var n=this.events[t].indexOf(e);this.events[t].splice(n,1),this.events[t].length||delete this.events[t]}},t.EventEmitter.prototype.emit=function(t){if(this.hasHandler(t)){var e=Array.prototype.slice.call(arguments,1);this.events[t].forEach(function(t){t.apply(void 0,e)})}},t.EventEmitter.prototype.hasHandler=function(t){return t in this.events},t.tokenizer=function(t){return arguments.length&&null!=t&&void 0!=t?Array.isArray(t)?t.map(function(t){return t.toLowerCase()}):t.toString().trim().toLowerCase().split(/[\s\-]+/):[]},t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.registeredFunctions[e];if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._stack.indexOf(e);if(-1==i)throw new Error("Cannot find existingFn");i+=1,this._stack.splice(i,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._stack.indexOf(e);if(-1==i)throw new Error("Cannot find existingFn");this._stack.splice(i,0,n)},t.Pipeline.prototype.remove=function(t){var e=this._stack.indexOf(t);-1!=e&&this._stack.splice(e,1)},t.Pipeline.prototype.run=function(t){for(var e=[],n=t.length,i=this._stack.length,o=0;n>o;o++){for(var r=t[o],s=0;i>s&&(r=this._stack[s](r,o,t),void 0!==r);s++);void 0!==r&&e.push(r)}return e},t.Pipeline.prototype.reset=function(){this._stack=[]},t.Pipeline.prototype.toJSON=function(){return this._stack.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Vector=function(){this._magnitude=null,this.list=void 0,this.length=0},t.Vector.Node=function(t,e,n){this.idx=t,this.val=e,this.next=n},t.Vector.prototype.insert=function(e,n){this._magnitude=void 0;var i=this.list;if(!i)return this.list=new t.Vector.Node(e,n,i),this.length++;if(en.idx?n=n.next:(i+=e.val*n.val,e=e.next,n=n.next);return i},t.Vector.prototype.similarity=function(t){return this.dot(t)/(this.magnitude()*t.magnitude())},t.SortedSet=function(){this.length=0,this.elements=[]},t.SortedSet.load=function(t){var e=new this;return e.elements=t,e.length=t.length,e},t.SortedSet.prototype.add=function(){var t,e;for(t=0;t1;){if(r===t)return o;t>r&&(e=o),r>t&&(n=o),i=n-e,o=e+Math.floor(i/2),r=this.elements[o]}return r===t?o:-1},t.SortedSet.prototype.locationFor=function(t){for(var e=0,n=this.elements.length,i=n-e,o=e+Math.floor(i/2),r=this.elements[o];i>1;)t>r&&(e=o),r>t&&(n=o),i=n-e,o=e+Math.floor(i/2),r=this.elements[o];return r>t?o:t>r?o+1:void 0},t.SortedSet.prototype.intersect=function(e){for(var n=new t.SortedSet,i=0,o=0,r=this.length,s=e.length,a=this.elements,h=e.elements;;){if(i>r-1||o>s-1)break;a[i]!==h[o]?a[i]h[o]&&o++:(n.add(a[i]),i++,o++)}return n},t.SortedSet.prototype.clone=function(){var e=new t.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},t.SortedSet.prototype.union=function(t){var e,n,i;return this.length>=t.length?(e=this,n=t):(e=t,n=this),i=e.clone(),i.add.apply(i,n.toArray()),i},t.SortedSet.prototype.toJSON=function(){return this.toArray()},t.Index=function(){this._fields=[],this._ref="id",this.pipeline=new t.Pipeline,this.documentStore=new t.Store,this.tokenStore=new t.TokenStore,this.corpusTokens=new t.SortedSet,this.eventEmitter=new t.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},t.Index.prototype.on=function(){var t=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,t)},t.Index.prototype.off=function(t,e){return this.eventEmitter.removeListener(t,e)},t.Index.load=function(e){e.version!==t.version&&t.utils.warn("version mismatch: current "+t.version+" importing "+e.version);var n=new this;return n._fields=e.fields,n._ref=e.ref,n.documentStore=t.Store.load(e.documentStore),n.tokenStore=t.TokenStore.load(e.tokenStore),n.corpusTokens=t.SortedSet.load(e.corpusTokens),n.pipeline=t.Pipeline.load(e.pipeline),n},t.Index.prototype.field=function(t,e){var e=e||{},n={name:t,boost:e.boost||1};return this._fields.push(n),this},t.Index.prototype.ref=function(t){return this._ref=t,this},t.Index.prototype.add=function(e,n){var i={},o=new t.SortedSet,r=e[this._ref],n=void 0===n?!0:n;this._fields.forEach(function(n){var r=this.pipeline.run(t.tokenizer(e[n.name]));i[n.name]=r,t.SortedSet.prototype.add.apply(o,r)},this),this.documentStore.set(r,o),t.SortedSet.prototype.add.apply(this.corpusTokens,o.toArray());for(var s=0;s0&&(i=1+Math.log(this.documentStore.length/n)),this._idfCache[e]=i},t.Index.prototype.search=function(e){var n=this.pipeline.run(t.tokenizer(e)),i=new t.Vector,o=[],r=this._fields.reduce(function(t,e){return t+e.boost},0),s=n.some(function(t){return this.tokenStore.has(t)},this);if(!s)return[];n.forEach(function(e,n,s){var a=1/s.length*this._fields.length*r,h=this,l=this.tokenStore.expand(e).reduce(function(n,o){var r=h.corpusTokens.indexOf(o),s=h.idf(o),l=1,u=new t.SortedSet;if(o!==e){var c=Math.max(3,o.length-e.length);l=1/Math.log(c)}return r>-1&&i.insert(r,a*s*l),Object.keys(h.tokenStore.get(o)).forEach(function(t){u.add(t)}),n.union(u)},new t.SortedSet);o.push(l)},this);var a=o.reduce(function(t,e){return t.intersect(e)});return a.map(function(t){return{ref:t,score:i.similarity(this.documentVector(t))}},this).sort(function(t,e){return e.score-t.score})},t.Index.prototype.documentVector=function(e){for(var n=this.documentStore.get(e),i=n.length,o=new t.Vector,r=0;i>r;r++){var s=n.elements[r],a=this.tokenStore.get(s)[e].tf,h=this.idf(s);o.insert(this.corpusTokens.indexOf(s),a*h)}return o},t.Index.prototype.toJSON=function(){return{version:t.version,fields:this._fields,ref:this._ref,documentStore:this.documentStore.toJSON(),tokenStore:this.tokenStore.toJSON(),corpusTokens:this.corpusTokens.toJSON(),pipeline:this.pipeline.toJSON()}},t.Index.prototype.use=function(t){var e=Array.prototype.slice.call(arguments,1);e.unshift(this),t.apply(this,e)},t.Store=function(){this.store={},this.length=0},t.Store.load=function(e){var n=new this;return n.length=e.length,n.store=Object.keys(e.store).reduce(function(n,i){return n[i]=t.SortedSet.load(e.store[i]),n},{}),n},t.Store.prototype.set=function(t,e){this.has(t)||this.length++,this.store[t]=e},t.Store.prototype.get=function(t){return this.store[t]},t.Store.prototype.has=function(t){return t in this.store},t.Store.prototype.remove=function(t){this.has(t)&&(delete this.store[t],this.length--)},t.Store.prototype.toJSON=function(){return{store:this.store,length:this.length}},t.stemmer=function(){var t={ational:"ate",tional:"tion",enci:"ence",anci:"ance",izer:"ize",bli:"ble",alli:"al",entli:"ent",eli:"e",ousli:"ous",ization:"ize",ation:"ate",ator:"ate",alism:"al",iveness:"ive",fulness:"ful",ousness:"ous",aliti:"al",iviti:"ive",biliti:"ble",logi:"log"},e={icate:"ic",ative:"",alize:"al",iciti:"ic",ical:"ic",ful:"",ness:""},n="[^aeiou]",i="[aeiouy]",o=n+"[^aeiouy]*",r=i+"[aeiou]*",s="^("+o+")?"+r+o,a="^("+o+")?"+r+o+"("+r+")?$",h="^("+o+")?"+r+o+r+o,l="^("+o+")?"+i,u=new RegExp(s),c=new RegExp(h),f=new RegExp(a),d=new RegExp(l),p=/^(.+?)(ss|i)es$/,m=/^(.+?)([^s])s$/,v=/^(.+?)eed$/,y=/^(.+?)(ed|ing)$/,g=/.$/,S=/(at|bl|iz)$/,w=new RegExp("([^aeiouylsz])\\1$"),x=new RegExp("^"+o+i+"[^aeiouwxy]$"),k=/^(.+?[^aeiou])y$/,b=/^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/,E=/^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/,_=/^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/,F=/^(.+?)(s|t)(ion)$/,O=/^(.+?)e$/,P=/ll$/,N=new RegExp("^"+o+i+"[^aeiouwxy]$"),T=function(n){var i,o,r,s,a,h,l;if(n.length<3)return n;if(r=n.substr(0,1),"y"==r&&(n=r.toUpperCase()+n.substr(1)),s=p,a=m,s.test(n)?n=n.replace(s,"$1$2"):a.test(n)&&(n=n.replace(a,"$1$2")),s=v,a=y,s.test(n)){var T=s.exec(n);s=u,s.test(T[1])&&(s=g,n=n.replace(s,""))}else if(a.test(n)){var T=a.exec(n);i=T[1],a=d,a.test(i)&&(n=i,a=S,h=w,l=x,a.test(n)?n+="e":h.test(n)?(s=g,n=n.replace(s,"")):l.test(n)&&(n+="e"))}if(s=k,s.test(n)){var T=s.exec(n);i=T[1],n=i+"i"}if(s=b,s.test(n)){var T=s.exec(n);i=T[1],o=T[2],s=u,s.test(i)&&(n=i+t[o])}if(s=E,s.test(n)){var T=s.exec(n);i=T[1],o=T[2],s=u,s.test(i)&&(n=i+e[o])}if(s=_,a=F,s.test(n)){var T=s.exec(n);i=T[1],s=c,s.test(i)&&(n=i)}else if(a.test(n)){var T=a.exec(n);i=T[1]+T[2],a=c,a.test(i)&&(n=i)}if(s=O,s.test(n)){var T=s.exec(n);i=T[1],s=c,a=f,h=N,(s.test(i)||a.test(i)&&!h.test(i))&&(n=i)}return s=P,a=c,s.test(n)&&a.test(n)&&(s=g,n=n.replace(s,"")),"y"==r&&(n=r.toLowerCase()+n.substr(1)),n};return T}(),t.Pipeline.registerFunction(t.stemmer,"stemmer"),t.stopWordFilter=function(e){return e&&t.stopWordFilter.stopWords[e]!==e?e:void 0},t.stopWordFilter.stopWords={a:"a",able:"able",about:"about",across:"across",after:"after",all:"all",almost:"almost",also:"also",am:"am",among:"among",an:"an",and:"and",any:"any",are:"are",as:"as",at:"at",be:"be",because:"because",been:"been",but:"but",by:"by",can:"can",cannot:"cannot",could:"could",dear:"dear",did:"did","do":"do",does:"does",either:"either","else":"else",ever:"ever",every:"every","for":"for",from:"from",get:"get",got:"got",had:"had",has:"has",have:"have",he:"he",her:"her",hers:"hers",him:"him",his:"his",how:"how",however:"however",i:"i","if":"if","in":"in",into:"into",is:"is",it:"it",its:"its",just:"just",least:"least",let:"let",like:"like",likely:"likely",may:"may",me:"me",might:"might",most:"most",must:"must",my:"my",neither:"neither",no:"no",nor:"nor",not:"not",of:"of",off:"off",often:"often",on:"on",only:"only",or:"or",other:"other",our:"our",own:"own",rather:"rather",said:"said",say:"say",says:"says",she:"she",should:"should",since:"since",so:"so",some:"some",than:"than",that:"that",the:"the",their:"their",them:"them",then:"then",there:"there",these:"these",they:"they","this":"this",tis:"tis",to:"to",too:"too",twas:"twas",us:"us",wants:"wants",was:"was",we:"we",were:"were",what:"what",when:"when",where:"where",which:"which","while":"while",who:"who",whom:"whom",why:"why",will:"will","with":"with",would:"would",yet:"yet",you:"you",your:"your"},t.Pipeline.registerFunction(t.stopWordFilter,"stopWordFilter"),t.trimmer=function(t){var e=t.replace(/^\W+/,"").replace(/\W+$/,"");return""===e?void 0:e},t.Pipeline.registerFunction(t.trimmer,"trimmer"),t.TokenStore=function(){this.root={docs:{}},this.length=0},t.TokenStore.load=function(t){var e=new this;return e.root=t.root,e.length=t.length,e},t.TokenStore.prototype.add=function(t,e,n){var n=n||this.root,i=t[0],o=t.slice(1);return i in n||(n[i]={docs:{}}),0===o.length?(n[i].docs[e.ref]=e,void(this.length+=1)):this.add(o,e,n[i])},t.TokenStore.prototype.has=function(t){if(!t)return!1;for(var e=this.root,n=0;n 0) && (_maxTocDepth >= 1)) { + tocArray[tocArray.length-1].children.push({ + name: header.text(), + url: headerId, + children: [] + }); + tocSize++; + }; + break; + case "H3": + if ((tocArray.length > 0) && (_maxTocDepth >= 2)) { + if (tocArray[tocArray.length-1].children.length > 0) { + tocArray[tocArray.length-1].children[tocArray[tocArray.length-1].children.length-1].children.push({ + name: header.text(), + url: headerId, + children: [] + }); + tocSize++; + }; + }; + break; + default: + break; + } + } + }; + + // Cancel if not enough headers to show + if ((tocSize == 0) || (tocSize < _minTocSize)) { + return; + } + + // Generate html for button and menu + var html = "
"; + + // Append generated html to page + $(".book").append(html) + +}); diff --git a/gitbook/gitbook-plugin-prism/prism-coy.css b/gitbook/gitbook-plugin-prism/prism-coy.css new file mode 100644 index 0000000..5118dca --- /dev/null +++ b/gitbook/gitbook-plugin-prism/prism-coy.css @@ -0,0 +1,226 @@ +/** + * prism.js Coy theme for JavaScript, CoffeeScript, CSS and HTML + * Based on https://github.com/tshedor/workshop-wp-theme (Example: http://workshop.kansan.com/category/sessions/basics or http://workshop.timshedor.com/category/sessions/basics); + * @author Tim Shedor + */ + +code[class*="language-"], +pre[class*="language-"] { + color: black; + background: none; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + font-size: 1em; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +/* Code blocks */ +pre[class*="language-"] { + position: relative; + margin: .5em 0; + overflow: visible; + padding: 0; +} +pre[class*="language-"]>code { + position: relative; + border-left: 10px solid #358ccb; + box-shadow: -1px 0px 0px 0px #358ccb, 0px 0px 0px 1px #dfdfdf; + background-color: #fdfdfd; + background-image: linear-gradient(transparent 50%, rgba(69, 142, 209, 0.04) 50%); + background-size: 3em 3em; + background-origin: content-box; + background-attachment: local; +} + +code[class*="language"] { + max-height: inherit; + height: inherit; + padding: 0 1em; + display: block; + overflow: auto; +} + +/* Margin bottom to accommodate shadow */ +:not(pre) > code[class*="language-"], +pre[class*="language-"] { + background-color: #fdfdfd; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + margin-bottom: 1em; +} + +/* Inline code */ +:not(pre) > code[class*="language-"] { + position: relative; + padding: .2em; + border-radius: 0.3em; + color: #c92c2c; + border: 1px solid rgba(0, 0, 0, 0.1); + display: inline; + white-space: normal; +} + +pre[class*="language-"]:before, +pre[class*="language-"]:after { + content: ''; + z-index: -2; + display: block; + position: absolute; + bottom: 0.75em; + left: 0.18em; + width: 40%; + height: 20%; + max-height: 13em; + box-shadow: 0px 13px 8px #979797; + -webkit-transform: rotate(-2deg); + -moz-transform: rotate(-2deg); + -ms-transform: rotate(-2deg); + -o-transform: rotate(-2deg); + transform: rotate(-2deg); +} + +:not(pre) > code[class*="language-"]:after, +pre[class*="language-"]:after { + right: 0.75em; + left: auto; + -webkit-transform: rotate(2deg); + -moz-transform: rotate(2deg); + -ms-transform: rotate(2deg); + -o-transform: rotate(2deg); + transform: rotate(2deg); +} + +.token.comment, +.token.block-comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: #7D8B99; +} + +.token.punctuation { + color: #5F6364; +} + +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.function-name, +.token.constant, +.token.symbol, +.token.deleted { + color: #c92c2c; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.function, +.token.builtin, +.token.inserted { + color: #2f9c0a; +} + +.token.operator, +.token.entity, +.token.url, +.token.variable { + color: #a67f59; + background: rgba(255, 255, 255, 0.5); +} + +.token.atrule, +.token.attr-value, +.token.keyword, +.token.class-name { + color: #1990b8; +} + +.token.regex, +.token.important { + color: #e90; +} + +.language-css .token.string, +.style .token.string { + color: #a67f59; + background: rgba(255, 255, 255, 0.5); +} + +.token.important { + font-weight: normal; +} + +.token.bold { + font-weight: bold; +} +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} + +.namespace { + opacity: .7; +} + +@media screen and (max-width: 767px) { + pre[class*="language-"]:before, + pre[class*="language-"]:after { + bottom: 14px; + box-shadow: none; + } + +} + +/* Plugin styles */ +.token.tab:not(:empty):before, +.token.cr:before, +.token.lf:before { + color: #e0d7d1; +} + +/* Plugin styles: Line Numbers */ +pre[class*="language-"].line-numbers.line-numbers { + padding-left: 0; +} + +pre[class*="language-"].line-numbers.line-numbers code { + padding-left: 3.8em; +} + +pre[class*="language-"].line-numbers.line-numbers .line-numbers-rows { + left: 0; +} + +/* Plugin styles: Line Highlight */ +pre[class*="language-"][data-line] { + padding-top: 0; + padding-bottom: 0; + padding-left: 0; +} +pre[data-line] code { + position: relative; + padding-left: 4em; +} +pre .line-highlight { + margin-top: 0; +} diff --git a/gitbook/gitbook-plugin-prism/prism-dark.css b/gitbook/gitbook-plugin-prism/prism-dark.css new file mode 100644 index 0000000..73387bf --- /dev/null +++ b/gitbook/gitbook-plugin-prism/prism-dark.css @@ -0,0 +1,129 @@ +/** + * prism.js Dark theme for JavaScript, CSS and HTML + * Based on the slides of the talk “/Reg(exp){2}lained/” + * @author Lea Verou + */ + +code[class*="language-"], +pre[class*="language-"] { + color: white; + background: none; + text-shadow: 0 -.1em .2em black; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + font-size: 1em; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +@media print { + code[class*="language-"], + pre[class*="language-"] { + text-shadow: none; + } +} + +pre[class*="language-"], +:not(pre) > code[class*="language-"] { + background: hsl(30, 20%, 25%); +} + +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: .5em 0; + overflow: auto; + border: .3em solid hsl(30, 20%, 40%); + border-radius: .5em; + box-shadow: 1px 1px .5em black inset; +} + +/* Inline code */ +:not(pre) > code[class*="language-"] { + padding: .15em .2em .05em; + border-radius: .3em; + border: .13em solid hsl(30, 20%, 40%); + box-shadow: 1px 1px .3em -.1em black inset; + white-space: normal; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: hsl(30, 20%, 50%); +} + +.token.punctuation { + opacity: .7; +} + +.namespace { + opacity: .7; +} + +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol { + color: hsl(350, 40%, 70%); +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: hsl(75, 70%, 60%); +} + +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string, +.token.variable { + color: hsl(40, 90%, 60%); +} + +.token.atrule, +.token.attr-value, +.token.keyword { + color: hsl(350, 40%, 70%); +} + +.token.regex, +.token.important { + color: #e90; +} + +.token.important, +.token.bold { + font-weight: bold; +} +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} + +.token.deleted { + color: red; +} diff --git a/gitbook/gitbook-plugin-prism/prism-funky.css b/gitbook/gitbook-plugin-prism/prism-funky.css new file mode 100644 index 0000000..2eda0b0 --- /dev/null +++ b/gitbook/gitbook-plugin-prism/prism-funky.css @@ -0,0 +1,117 @@ +/** + * prism.js Funky theme + * Based on “Polyfilling the gaps” talk slides http://lea.verou.me/polyfilling-the-gaps/ + * @author Lea Verou + */ + +code[class*="language-"], +pre[class*="language-"] { + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + font-size: 1em; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +/* Code blocks */ +pre[class*="language-"] { + padding: .4em .8em; + margin: .5em 0; + overflow: auto; + background: url('data:image/svg+xml;charset=utf-8,%0D%0A%0D%0A%0D%0A<%2Fsvg>'); + background-size: 1em 1em; +} + +code[class*="language-"] { + background: black; + color: white; + box-shadow: -.3em 0 0 .3em black, .3em 0 0 .3em black; +} + +/* Inline code */ +:not(pre) > code[class*="language-"] { + padding: .2em; + border-radius: .3em; + box-shadow: none; + white-space: normal; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: #aaa; +} + +.token.punctuation { + color: #999; +} + +.namespace { + opacity: .7; +} + +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol { + color: #0cf; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin { + color: yellow; +} + +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.toke.variable, +.token.inserted { + color: yellowgreen; +} + +.token.atrule, +.token.attr-value, +.token.keyword { + color: deeppink; +} + +.token.regex, +.token.important { + color: orange; +} + +.token.important, +.token.bold { + font-weight: bold; +} +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} + +.token.deleted { + color: red; +} diff --git a/gitbook/gitbook-plugin-prism/prism-okaidia.css b/gitbook/gitbook-plugin-prism/prism-okaidia.css new file mode 100644 index 0000000..767417b --- /dev/null +++ b/gitbook/gitbook-plugin-prism/prism-okaidia.css @@ -0,0 +1,123 @@ +/** + * okaidia theme for JavaScript, CSS and HTML + * Loosely based on Monokai textmate theme by http://www.monokai.nl/ + * @author ocodia + */ + +code[class*="language-"], +pre[class*="language-"] { + color: #f8f8f2; + background: none; + text-shadow: 0 1px rgba(0, 0, 0, 0.3); + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + font-size: 1em; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: .5em 0; + overflow: auto; + border-radius: 0.3em; +} + +:not(pre) > code[class*="language-"], +pre[class*="language-"] { + background: #272822; +} + +/* Inline code */ +:not(pre) > code[class*="language-"] { + padding: .1em; + border-radius: .3em; + white-space: normal; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: slategray; +} + +.token.punctuation { + color: #f8f8f2; +} + +.namespace { + opacity: .7; +} + +.token.property, +.token.tag, +.token.constant, +.token.symbol, +.token.deleted { + color: #f92672; +} + +.token.boolean, +.token.number { + color: #ae81ff; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #a6e22e; +} + +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string, +.token.variable { + color: #f8f8f2; +} + +.token.atrule, +.token.attr-value, +.token.function, +.token.class-name { + color: #e6db74; +} + +.token.keyword { + color: #66d9ef; +} + +.token.regex, +.token.important { + color: #fd971f; +} + +.token.important, +.token.bold { + font-weight: bold; +} +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} diff --git a/gitbook/gitbook-plugin-prism/prism-solarizedlight.css b/gitbook/gitbook-plugin-prism/prism-solarizedlight.css new file mode 100644 index 0000000..6c4715e --- /dev/null +++ b/gitbook/gitbook-plugin-prism/prism-solarizedlight.css @@ -0,0 +1,150 @@ +/* + Solarized Color Schemes originally by Ethan Schoonover + http://ethanschoonover.com/solarized + + Ported for PrismJS by Hector Matos + Website: https://krakendev.io + Twitter Handle: https://twitter.com/allonsykraken) +*/ + +/* +SOLARIZED HEX +--------- ------- +base03 #002b36 +base02 #073642 +base01 #586e75 +base00 #657b83 +base0 #839496 +base1 #93a1a1 +base2 #eee8d5 +base3 #fdf6e3 +yellow #b58900 +orange #cb4b16 +red #dc322f +magenta #d33682 +violet #6c71c4 +blue #268bd2 +cyan #2aa198 +green #859900 +*/ + +code[class*="language-"], +pre[class*="language-"] { + color: #657b83; /* base00 */ + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + font-size: 1em; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + + line-height: 1.5; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, +code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { + background: #073642; /* base02 */ +} + +pre[class*="language-"]::selection, pre[class*="language-"] ::selection, +code[class*="language-"]::selection, code[class*="language-"] ::selection { + background: #073642; /* base02 */ +} + +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: .5em 0; + overflow: auto; + border-radius: 0.3em; +} + +:not(pre) > code[class*="language-"], +pre[class*="language-"] { + background-color: #fdf6e3; /* base3 */ +} + +/* Inline code */ +:not(pre) > code[class*="language-"] { + padding: .1em; + border-radius: .3em; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: #93a1a1; /* base1 */ +} + +.token.punctuation { + color: #586e75; /* base01 */ +} + +.namespace { + opacity: .7; +} + +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: #268bd2; /* blue */ +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.url, +.token.inserted { + color: #2aa198; /* cyan */ +} + +.token.entity { + color: #657b83; /* base00 */ + background: #eee8d5; /* base2 */ +} + +.token.atrule, +.token.attr-value, +.token.keyword { + color: #859900; /* green */ +} + +.token.function, +.token.class-name { + color: #b58900; /* yellow */ +} + +.token.regex, +.token.important, +.token.variable { + color: #cb4b16; /* orange */ +} + +.token.important, +.token.bold { + font-weight: bold; +} +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} diff --git a/gitbook/gitbook-plugin-prism/prism-tomorrow.css b/gitbook/gitbook-plugin-prism/prism-tomorrow.css new file mode 100644 index 0000000..a0eeff0 --- /dev/null +++ b/gitbook/gitbook-plugin-prism/prism-tomorrow.css @@ -0,0 +1,122 @@ +/** + * prism.js tomorrow night eighties for JavaScript, CoffeeScript, CSS and HTML + * Based on https://github.com/chriskempson/tomorrow-theme + * @author Rose Pritchard + */ + +code[class*="language-"], +pre[class*="language-"] { + color: #ccc; + background: none; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + font-size: 1em; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; + +} + +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: .5em 0; + overflow: auto; +} + +:not(pre) > code[class*="language-"], +pre[class*="language-"] { + background: #2d2d2d; +} + +/* Inline code */ +:not(pre) > code[class*="language-"] { + padding: .1em; + border-radius: .3em; + white-space: normal; +} + +.token.comment, +.token.block-comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: #999; +} + +.token.punctuation { + color: #ccc; +} + +.token.tag, +.token.attr-name, +.token.namespace, +.token.deleted { + color: #e2777a; +} + +.token.function-name { + color: #6196cc; +} + +.token.boolean, +.token.number, +.token.function { + color: #f08d49; +} + +.token.property, +.token.class-name, +.token.constant, +.token.symbol { + color: #f8c555; +} + +.token.selector, +.token.important, +.token.atrule, +.token.keyword, +.token.builtin { + color: #cc99cd; +} + +.token.string, +.token.char, +.token.attr-value, +.token.regex, +.token.variable { + color: #7ec699; +} + +.token.operator, +.token.entity, +.token.url { + color: #67cdcc; +} + +.token.important, +.token.bold { + font-weight: bold; +} +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} + +.token.inserted { + color: green; +} diff --git a/gitbook/gitbook-plugin-prism/prism-twilight.css b/gitbook/gitbook-plugin-prism/prism-twilight.css new file mode 100644 index 0000000..662df42 --- /dev/null +++ b/gitbook/gitbook-plugin-prism/prism-twilight.css @@ -0,0 +1,199 @@ +/** + * prism.js Twilight theme + * Based (more or less) on the Twilight theme originally of Textmate fame. + * @author Remy Bach + */ +code[class*="language-"], +pre[class*="language-"] { + color: white; + background: none; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + font-size: 1em; + text-align: left; + text-shadow: 0 -.1em .2em black; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +pre[class*="language-"], +:not(pre) > code[class*="language-"] { + background: hsl(0, 0%, 8%); /* #141414 */ +} + +/* Code blocks */ +pre[class*="language-"] { + border-radius: .5em; + border: .3em solid hsl(0, 0%, 33%); /* #282A2B */ + box-shadow: 1px 1px .5em black inset; + margin: .5em 0; + overflow: auto; + padding: 1em; +} + +pre[class*="language-"]::-moz-selection { + /* Firefox */ + background: hsl(200, 4%, 16%); /* #282A2B */ +} + +pre[class*="language-"]::selection { + /* Safari */ + background: hsl(200, 4%, 16%); /* #282A2B */ +} + +/* Text Selection colour */ +pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, +code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { + text-shadow: none; + background: hsla(0, 0%, 93%, 0.15); /* #EDEDED */ +} + +pre[class*="language-"]::selection, pre[class*="language-"] ::selection, +code[class*="language-"]::selection, code[class*="language-"] ::selection { + text-shadow: none; + background: hsla(0, 0%, 93%, 0.15); /* #EDEDED */ +} + +/* Inline code */ +:not(pre) > code[class*="language-"] { + border-radius: .3em; + border: .13em solid hsl(0, 0%, 33%); /* #545454 */ + box-shadow: 1px 1px .3em -.1em black inset; + padding: .15em .2em .05em; + white-space: normal; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: hsl(0, 0%, 47%); /* #777777 */ +} + +.token.punctuation { + opacity: .7; +} + +.namespace { + opacity: .7; +} + +.token.tag, +.token.boolean, +.token.number, +.token.deleted { + color: hsl(14, 58%, 55%); /* #CF6A4C */ +} + +.token.keyword, +.token.property, +.token.selector, +.token.constant, +.token.symbol, +.token.builtin { + color: hsl(53, 89%, 79%); /* #F9EE98 */ +} + +.token.attr-name, +.token.attr-value, +.token.string, +.token.char, +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string, +.token.variable, +.token.inserted { + color: hsl(76, 21%, 52%); /* #8F9D6A */ +} + +.token.atrule { + color: hsl(218, 22%, 55%); /* #7587A6 */ +} + +.token.regex, +.token.important { + color: hsl(42, 75%, 65%); /* #E9C062 */ +} + +.token.important, +.token.bold { + font-weight: bold; +} +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} + +pre[data-line] { + padding: 1em 0 1em 3em; + position: relative; +} + +/* Markup */ +.language-markup .token.tag, +.language-markup .token.attr-name, +.language-markup .token.punctuation { + color: hsl(33, 33%, 52%); /* #AC885B */ +} + +/* Make the tokens sit above the line highlight so the colours don't look faded. */ +.token { + position: relative; + z-index: 1; +} + +.line-highlight { + background: hsla(0, 0%, 33%, 0.25); /* #545454 */ + background: linear-gradient(to right, hsla(0, 0%, 33%, .1) 70%, hsla(0, 0%, 33%, 0)); /* #545454 */ + border-bottom: 1px dashed hsl(0, 0%, 33%); /* #545454 */ + border-top: 1px dashed hsl(0, 0%, 33%); /* #545454 */ + left: 0; + line-height: inherit; + margin-top: 0.75em; /* Same as .prism’s padding-top */ + padding: inherit 0; + pointer-events: none; + position: absolute; + right: 0; + white-space: pre; + z-index: 0; +} + +.line-highlight:before, +.line-highlight[data-end]:after { + background-color: hsl(215, 15%, 59%); /* #8794A6 */ + border-radius: 999px; + box-shadow: 0 1px white; + color: hsl(24, 20%, 95%); /* #F5F2F0 */ + content: attr(data-start); + font: bold 65%/1.5 sans-serif; + left: .6em; + min-width: 1em; + padding: 0 .5em; + position: absolute; + text-align: center; + text-shadow: none; + top: .4em; + vertical-align: .3em; +} + +.line-highlight[data-end]:after { + bottom: .4em; + content: attr(data-end); + top: auto; +} diff --git a/gitbook/gitbook-plugin-prism/prism.css b/gitbook/gitbook-plugin-prism/prism.css new file mode 100644 index 0000000..ec469f0 --- /dev/null +++ b/gitbook/gitbook-plugin-prism/prism.css @@ -0,0 +1,139 @@ +/** + * prism.js default theme for JavaScript, CSS and HTML + * Based on dabblet (http://dabblet.com) + * @author Lea Verou + */ + +code[class*="language-"], +pre[class*="language-"] { + color: black; + background: none; + text-shadow: 0 1px white; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + font-size: 1em; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, +code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { + text-shadow: none; + background: #b3d4fc; +} + +pre[class*="language-"]::selection, pre[class*="language-"] ::selection, +code[class*="language-"]::selection, code[class*="language-"] ::selection { + text-shadow: none; + background: #b3d4fc; +} + +@media print { + code[class*="language-"], + pre[class*="language-"] { + text-shadow: none; + } +} + +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: .5em 0; + overflow: auto; +} + +:not(pre) > code[class*="language-"], +pre[class*="language-"] { + background: #f5f2f0; +} + +/* Inline code */ +:not(pre) > code[class*="language-"] { + padding: .1em; + border-radius: .3em; + white-space: normal; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: slategray; +} + +.token.punctuation { + color: #999; +} + +.namespace { + opacity: .7; +} + +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: #905; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #690; +} + +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + color: #9a6e3a; + background: hsla(0, 0%, 100%, .5); +} + +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} + +.token.function, +.token.class-name { + color: #DD4A68; +} + +.token.regex, +.token.important, +.token.variable { + color: #e90; +} + +.token.important, +.token.bold { + font-weight: bold; +} +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} diff --git a/gitbook/gitbook-plugin-search-plus/jquery.mark.min.js b/gitbook/gitbook-plugin-search-plus/jquery.mark.min.js new file mode 100644 index 0000000..a126e95 --- /dev/null +++ b/gitbook/gitbook-plugin-search-plus/jquery.mark.min.js @@ -0,0 +1,7 @@ +/*!*************************************************** + * mark.js v8.8.0 + * https://github.com/julmot/mark.js + * Copyright (c) 2014–2017, Julian Motz + * Released under the MIT license https://git.io/vwTVl + *****************************************************/ +"use strict";function _classCallCheck(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}var _extends=Object.assign||function(a){for(var b=1;b-1||d.indexOf("Trident")>-1)&&(this.ie=!0)}return _createClass(c,[{key:"log",value:function a(b){var c=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"debug",a=this.opt.log;this.opt.debug&&"object"===("undefined"==typeof a?"undefined":_typeof(a))&&"function"==typeof a[c]&&a[c]("mark.js: "+b)}},{key:"escapeStr",value:function(a){return a.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}},{key:"createRegExp",value:function(a){return a=this.escapeStr(a),Object.keys(this.opt.synonyms).length&&(a=this.createSynonymsRegExp(a)),this.opt.ignoreJoiners&&(a=this.setupIgnoreJoinersRegExp(a)),this.opt.diacritics&&(a=this.createDiacriticsRegExp(a)),a=this.createMergedBlanksRegExp(a),this.opt.ignoreJoiners&&(a=this.createIgnoreJoinersRegExp(a)),a=this.createAccuracyRegExp(a)}},{key:"createSynonymsRegExp",value:function(a){var b=this.opt.synonyms,c=this.opt.caseSensitive?"":"i";for(var d in b)if(b.hasOwnProperty(d)){var e=b[d],f=this.escapeStr(d),g=this.escapeStr(e);a=a.replace(new RegExp("("+f+"|"+g+")","gm"+c),"("+f+"|"+g+")")}return a}},{key:"setupIgnoreJoinersRegExp",value:function(a){return a.replace(/[^(|)\\]/g,function(a,b,c){var d=c.charAt(b+1);return/[(|)\\]/.test(d)||""===d?a:a+"\0"})}},{key:"createIgnoreJoinersRegExp",value:function(a){return a.split("\0").join("[\\u00ad|\\u200b|\\u200c|\\u200d]?")}},{key:"createDiacriticsRegExp",value:function(a){var b=this.opt.caseSensitive?"":"i",c=this.opt.caseSensitive?["aàáâãäåāąă","AÀÁÂÃÄÅĀĄĂ","cçćč","CÇĆČ","dđď","DĐĎ","eèéêëěēę","EÈÉÊËĚĒĘ","iìíîïī","IÌÍÎÏĪ","lł","LŁ","nñňń","NÑŇŃ","oòóôõöøō","OÒÓÔÕÖØŌ","rř","RŘ","sšśșş","SŠŚȘŞ","tťțţ","TŤȚŢ","uùúûüůū","UÙÚÛÜŮŪ","yÿý","YŸÝ","zžżź","ZŽŻŹ"]:["aÀÁÂÃÄÅàáâãäåĀāąĄăĂ","cÇçćĆčČ","dđĐďĎ","eÈÉÊËèéêëěĚĒēęĘ","iÌÍÎÏìíîïĪī","lłŁ","nÑñňŇńŃ","oÒÓÔÕÖØòóôõöøŌō","rřŘ","sŠšśŚșȘşŞ","tťŤțȚţŢ","uÙÚÛÜùúûüůŮŪū","yŸÿýÝ","zŽžżŻźŹ"],d=[];return a.split("").forEach(function(e){c.every(function(c){if(c.indexOf(e)!==-1){if(d.indexOf(c)>-1)return!1;a=a.replace(new RegExp("["+c+"]","gm"+b),"["+c+"]"),d.push(c)}return!0})}),a}},{key:"createMergedBlanksRegExp",value:function(a){return a.replace(/[\s]+/gim,"[\\s]+")}},{key:"createAccuracyRegExp",value:function(a){var b=this,c=this.opt.accuracy,d="string"==typeof c?c:c.value,e="string"==typeof c?[]:c.limiters,f="";switch(e.forEach(function(a){f+="|"+b.escapeStr(a)}),d){case"partially":default:return"()("+a+")";case"complementary":return"()([^\\s"+f+"]*"+a+"[^\\s"+f+"]*)";case"exactly":return"(^|\\s"+f+")("+a+")(?=$|\\s"+f+")"}}},{key:"getSeparatedKeywords",value:function(a){var b=this,c=[];return a.forEach(function(a){b.opt.separateWordSearch?a.split(" ").forEach(function(a){a.trim()&&c.indexOf(a)===-1&&c.push(a)}):a.trim()&&c.indexOf(a)===-1&&c.push(a)}),{keywords:c.sort(function(a,b){return b.length-a.length}),length:c.length}}},{key:"getTextNodes",value:function(a){var b=this,c="",d=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,function(a){d.push({start:c.length,end:(c+=a.textContent).length,node:a})},function(a){return b.matchesExclude(a.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},function(){a({value:c,nodes:d})})}},{key:"matchesExclude",value:function(a){return e.matches(a,this.opt.exclude.concat(["script","style","title","head","html"]))}},{key:"wrapRangeInTextNode",value:function(a,c,d){var e=this.opt.element?this.opt.element:"mark",f=a.splitText(c),g=f.splitText(d-c),h=b.createElement(e);return h.setAttribute("data-markjs","true"),this.opt.className&&h.setAttribute("class",this.opt.className),h.textContent=f.textContent,f.parentNode.replaceChild(h,f),g}},{key:"wrapRangeInMappedTextNode",value:function(a,b,c,d,e){var f=this;a.nodes.every(function(g,h){var i=a.nodes[h+1];if("undefined"==typeof i||i.start>b){var j=function(){if(!d(g.node))return{v:!1};var i=b-g.start,j=(c>g.end?g.end:c)-g.start,k=a.value.substr(0,g.start),l=a.value.substr(j+g.start);return g.node=f.wrapRangeInTextNode(g.node,i,j),a.value=k+l,a.nodes.forEach(function(b,c){c>=h&&(a.nodes[c].start>0&&c!==h&&(a.nodes[c].start-=j),a.nodes[c].end-=j)}),c-=j,e(g.node.previousSibling,g.start),c>g.end?void(b=g.end):{v:!1}}();if("object"===("undefined"==typeof j?"undefined":_typeof(j)))return j.v}return!0})}},{key:"wrapMatches",value:function(a,b,c,d,e){var f=this,g=0===b?0:b+1;this.getTextNodes(function(b){b.nodes.forEach(function(b){b=b.node;for(var e=void 0;null!==(e=a.exec(b.textContent))&&""!==e[g];)if(c(e[g],b)){var h=e.index;if(0!==g)for(var i=1;i1&&void 0!==arguments[1])||arguments[1],d=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],e=arguments.length>3&&void 0!==arguments[3]?arguments[3]:5e3;_classCallCheck(this,a),this.ctx=b,this.iframes=c,this.exclude=d,this.iframesTimeout=e}return _createClass(a,[{key:"getContexts",value:function(){var a=void 0,c=[];return a="undefined"!=typeof this.ctx&&this.ctx?NodeList.prototype.isPrototypeOf(this.ctx)?Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?this.ctx:"string"==typeof this.ctx?Array.prototype.slice.call(b.querySelectorAll(this.ctx)):[this.ctx]:[],a.forEach(function(a){var b=c.filter(function(b){return b.contains(a)}).length>0;c.indexOf(a)!==-1||b||c.push(a)}),c}},{key:"getIframeContents",value:function(a,b){var c=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){},d=void 0;try{var e=a.contentWindow;if(d=e.document,!e||!d)throw new Error("iframe inaccessible")}catch(a){c()}d&&b(d)}},{key:"isIframeBlank",value:function(a){var b="about:blank",c=a.getAttribute("src").trim(),d=a.contentWindow.location.href;return d===b&&c!==b&&c}},{key:"observeIframeLoad",value:function(a,b,c){var d=this,e=!1,f=null,g=function g(){if(!e){e=!0,clearTimeout(f);try{d.isIframeBlank(a)||(a.removeEventListener("load",g),d.getIframeContents(a,b,c))}catch(a){c()}}};a.addEventListener("load",g),f=setTimeout(g,this.iframesTimeout)}},{key:"onIframeReady",value:function(a,b,c){try{"complete"===a.contentWindow.document.readyState?this.isIframeBlank(a)?this.observeIframeLoad(a,b,c):this.getIframeContents(a,b,c):this.observeIframeLoad(a,b,c)}catch(a){c()}}},{key:"waitForIframes",value:function(a,b){var c=this,d=0;this.forEachIframe(a,function(){return!0},function(a){d++,c.waitForIframes(a.querySelector("html"),function(){--d||b()})},function(a){a||b()})}},{key:"forEachIframe",value:function(b,c,d){var e=this,f=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},g=b.querySelectorAll("iframe"),h=g.length,i=0;g=Array.prototype.slice.call(g);var j=function(){--h<=0&&f(i)};h||j(),g.forEach(function(b){a.matches(b,e.exclude)?j():e.onIframeReady(b,function(a){c(b)&&(i++,d(a)),j()},j)})}},{key:"createIterator",value:function(a,c,d){return b.createNodeIterator(a,c,d,!1)}},{key:"createInstanceOnIframe",value:function(b){return new a(b.querySelector("html"),this.iframes)}},{key:"compareNodeIframe",value:function(a,b,c){var d=a.compareDocumentPosition(c),e=Node.DOCUMENT_POSITION_PRECEDING;if(d&e){if(null===b)return!0;var f=b.compareDocumentPosition(c),g=Node.DOCUMENT_POSITION_FOLLOWING;if(f&g)return!0}return!1}},{key:"getIteratorNode",value:function(a){var b=a.previousNode(),c=void 0;return c=null===b?a.nextNode():a.nextNode()&&a.nextNode(),{prevNode:b,node:c}}},{key:"checkIframeFilter",value:function(a,b,c,d){var e=!1,f=!1;return d.forEach(function(a,b){a.val===c&&(e=b,f=a.handled)}),this.compareNodeIframe(a,b,c)?(e!==!1||f?e===!1||f||(d[e].handled=!0):d.push({val:c,handled:!0}),!0):(e===!1&&d.push({val:c,handled:!1}),!1)}},{key:"handleOpenIframes",value:function(a,b,c,d){var e=this;a.forEach(function(a){a.handled||e.getIframeContents(a.val,function(a){e.createInstanceOnIframe(a).forEachNode(b,c,d)})})}},{key:"iterateThroughNodes",value:function(a,b,c,d,e){for(var f=this,g=this.createIterator(b,a,d),h=[],i=[],j=void 0,k=void 0,l=function(){var a=f.getIteratorNode(g);return k=a.prevNode,j=a.node};l();)this.iframes&&this.forEachIframe(b,function(a){return f.checkIframeFilter(j,k,a,h)},function(b){f.createInstanceOnIframe(b).forEachNode(a,c,d)}),i.push(j);i.forEach(function(a){c(a)}),this.iframes&&this.handleOpenIframes(h,a,c,d),e()}},{key:"forEachNode",value:function(a,b,c){var d=this,e=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},f=this.getContexts(),g=f.length;g||e(),f.forEach(function(f){var h=function(){d.iterateThroughNodes(a,f,b,c,function(){--g<=0&&e()})};d.iframes?d.waitForIframes(f,h):h()})}}],[{key:"matches",value:function(a,b){var c="string"==typeof b?[b]:b,d=a.matches||a.matchesSelector||a.msMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.webkitMatchesSelector;if(d){var e=!1;return c.every(function(b){return!d.call(a,b)||(e=!0,!1)}),e}return!1}}]),a}();return c.fn.mark=function(a,b){return new d(this.get()).mark(a,b),this},c.fn.markRegExp=function(a,b){return new d(this.get()).markRegExp(a,b),this},c.fn.unmark=function(a){return new d(this.get()).unmark(a),this},c},window,document); \ No newline at end of file diff --git a/gitbook/gitbook-plugin-search-plus/search.css b/gitbook/gitbook-plugin-search-plus/search.css new file mode 100644 index 0000000..4dba667 --- /dev/null +++ b/gitbook/gitbook-plugin-search-plus/search.css @@ -0,0 +1,41 @@ +/* + This CSS only styled the search results section, not the search input + It defines the basic interraction to hide content when displaying results, etc +*/ +#book-search-input { + background: inherit; +} +#book-search-results .search-results { + display: none; +} +#book-search-results .search-results ul.search-results-list { + list-style-type: none; + padding-left: 0; +} +#book-search-results .search-results ul.search-results-list li { + margin-bottom: 1.5rem; + padding-bottom: 0.5rem; + /* Highlight results */ +} +#book-search-results .search-results ul.search-results-list li p em { + background-color: rgba(255, 220, 0, 0.4); + font-style: normal; +} +#book-search-results .search-results .no-results { + display: none; +} +#book-search-results.open .search-results { + display: block; +} +#book-search-results.open .search-noresults { + display: none; +} +#book-search-results.no-results .search-results .has-results { + display: none; +} +#book-search-results.no-results .search-results .no-results { + display: block; +} +#book-search-results span.search-highlight-keyword { + background: #ff0; +} diff --git a/gitbook/gitbook-plugin-search-plus/search.js b/gitbook/gitbook-plugin-search-plus/search.js new file mode 100644 index 0000000..8e6401e --- /dev/null +++ b/gitbook/gitbook-plugin-search-plus/search.js @@ -0,0 +1,263 @@ +require([ + 'gitbook', + 'jquery' +], function(gitbook, $) { + var MAX_DESCRIPTION_SIZE = 500; + var state = gitbook.state; + var INDEX_DATA = {}; + var usePushState = (typeof history.pushState !== 'undefined'); + + // DOM Elements + var $body = $('body'); + var $bookSearchResults; + var $searchList; + var $searchTitle; + var $searchResultsCount; + var $searchQuery; + + // Throttle search + function throttle(fn, wait) { + var timeout; + + return function() { + var ctx = this, + args = arguments; + if (!timeout) { + timeout = setTimeout(function() { + timeout = null; + fn.apply(ctx, args); + }, wait); + } + }; + } + + function displayResults(res) { + $bookSearchResults = $('#book-search-results'); + $searchList = $bookSearchResults.find('.search-results-list'); + $searchTitle = $bookSearchResults.find('.search-results-title'); + $searchResultsCount = $searchTitle.find('.search-results-count'); + $searchQuery = $searchTitle.find('.search-query'); + + $bookSearchResults.addClass('open'); + + var noResults = res.count == 0; + $bookSearchResults.toggleClass('no-results', noResults); + + // Clear old results + $searchList.empty(); + + // Display title for research + $searchResultsCount.text(res.count); + $searchQuery.text(res.query); + + // Create an
  • element for each result + res.results.forEach(function(item) { + var $li = $('
  • ', { + 'class': 'search-results-item' + }); + + var $title = $('

    '); + + var $link = $('', { + 'href': gitbook.state.basePath + '/' + item.url + '?h=' + encodeURIComponent(res.query), + 'text': item.title, + 'data-is-search': 1 + }); + + if ($link[0].href.split('?')[0] === location.href.split('?')[0]) { + $link[0].setAttribute('data-need-reload', 1); + } + + var content = item.body.trim(); + if (content.length > MAX_DESCRIPTION_SIZE) { + content = content + '...'; + } + var $content = $('

    ').html(content); + + $link.appendTo($title); + $title.appendTo($li); + $content.appendTo($li); + $li.appendTo($searchList); + }); + $('.body-inner').scrollTop(0); + } + + function escapeRegExp(keyword) { + //escape regexp prevserve word + return String(keyword).replace(/([-.*+?^${}()|[\]\/\\])/g, '\\$1'); + } + + function query(keyword) { + if (keyword == null || keyword.trim() === '') return; + + var results = [], + index = -1; + for (var page in INDEX_DATA) { + if ((index = INDEX_DATA[page].body.toLowerCase().indexOf(keyword.toLowerCase())) !== -1) { + results.push({ + url: page, + title: INDEX_DATA[page].title, + body: INDEX_DATA[page].body.substr(Math.max(0, index - 50), MAX_DESCRIPTION_SIZE) + .replace(/^[^\s,.]+./,'').replace(/(..*)[\s,.].*/, '$1') //prevent break word + .replace(new RegExp('(' + escapeRegExp(keyword) + ')', 'gi'), '$1') + }); + } + } + displayResults({ + count: results.length, + query: keyword, + results: results + }); + } + + function launchSearch(keyword) { + // Add class for loading + $body.addClass('with-search'); + $body.addClass('search-loading'); + + function doSearch() { + query(keyword); + $body.removeClass('search-loading'); + } + + throttle(doSearch)(); + } + + function closeSearch() { + $body.removeClass('with-search'); + $('#book-search-results').removeClass('open'); + } + + function bindSearch() { + // Bind DOM + var $body = $('body'); + + // Launch query based on input content + function handleUpdate() { + var $searchInput = $('#book-search-input input'); + var keyword = $searchInput.val(); + + if (keyword.length == 0) { + closeSearch(); + } else { + launchSearch(keyword); + } + } + + $body.on('keyup', '#book-search-input input', function(e) { + if (e.keyCode === 13) { + if (usePushState) { + var uri = updateQueryString('q', $(this).val()); + history.pushState({ + path: uri + }, null, uri); + } + } + handleUpdate(); + }); + + // Push to history on blur + $body.on('blur', '#book-search-input input', function(e) { + // Update history state + if (usePushState) { + var uri = updateQueryString('q', $(this).val()); + history.pushState({ + path: uri + }, null, uri); + } + }); + } + + gitbook.events.on('start', function() { + bindSearch(); + $.getJSON(state.basePath + "/search_plus_index.json").then(function(data) { + INDEX_DATA = data; + showResult(); + closeSearch(); + }); + }); + + // 高亮文本 + var highLightPageInner = function(keyword) { + $('.page-inner').mark(keyword, { + 'ignoreJoiners': true, + 'acrossElements': true, + 'separateWordSearch': false + }); + + setTimeout(function() { + var mark = $('mark[data-markjs="true"]'); + if (mark.length) { + mark[0].scrollIntoView(); + } + }, 100); + }; + + function showResult() { + var keyword, type; + if (/\b(q|h)=([^&]+)/.test(location.search)) { + type = RegExp.$1; + keyword = decodeURIComponent(RegExp.$2); + if (type === 'q') { + launchSearch(keyword); + } else { + highLightPageInner(keyword); + } + $('#book-search-input input').val(keyword); + } + } + + gitbook.events.on('page.change', showResult); + + function getParameterByName(name) { + var url = window.location.href; + name = name.replace(/[\[\]]/g, '\\$&'); + var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)', 'i'), + results = regex.exec(url); + if (!results) return null; + if (!results[2]) return ''; + return decodeURIComponent(results[2].replace(/\+/g, ' ')); + } + + function updateQueryString(key, value) { + value = encodeURIComponent(value); + + var url = window.location.href.replace(/([?&])(?:q|h)=([^&]+)(&|$)/, function(all, pre, value, end) { + if (end === '&') { + return pre; + } + return ''; + }); + var re = new RegExp('([?&])' + key + '=.*?(&|#|$)(.*)', 'gi'), + hash; + + if (re.test(url)) { + if (typeof value !== 'undefined' && value !== null) + return url.replace(re, '$1' + key + '=' + value + '$2$3'); + else { + hash = url.split('#'); + url = hash[0].replace(re, '$1$3').replace(/(&|\?)$/, ''); + if (typeof hash[1] !== 'undefined' && hash[1] !== null) + url += '#' + hash[1]; + return url; + } + } else { + if (typeof value !== 'undefined' && value !== null) { + var separator = url.indexOf('?') !== -1 ? '&' : '?'; + hash = url.split('#'); + url = hash[0] + separator + key + '=' + value; + if (typeof hash[1] !== 'undefined' && hash[1] !== null) + url += '#' + hash[1]; + return url; + } else + return url; + } + } + window.addEventListener('click', function(e) { + if (e.target.tagName === 'A' && e.target.getAttribute('data-need-reload')) { + setTimeout(function() { + location.reload(); + }, 100); + } + }, true); +}); \ No newline at end of file diff --git a/gitbook/gitbook-plugin-sharing-plus/buttons.js b/gitbook/gitbook-plugin-sharing-plus/buttons.js new file mode 100644 index 0000000..d63e0f9 --- /dev/null +++ b/gitbook/gitbook-plugin-sharing-plus/buttons.js @@ -0,0 +1,71 @@ +require(['gitbook', 'jquery'], function(gitbook, $) { + function site(label, icon, link) { + return { + label: label, + icon: 'fa fa-' + icon, + onClick: function (e) { + e.preventDefault(); + window.open(link); + } + }; + } + + var url = encodeURIComponent(location.href); + var title = encodeURIComponent(document.title); + + var SITES = { + douban: site('豆瓣', 'share', 'http://shuo.douban.com/!service/share?href=' + url + '&name=' + title), + facebook: site('Facebook', 'facebook', 'http://www.facebook.com/sharer/sharer.php?s=100&p[url]=' + url), + google: site('Google+', 'google-plus', 'https://plus.google.com/share?url=' + url), + hatenaBookmark: site('はてなブックマーク', 'bold', 'http://b.hatena.ne.jp/entry/' + url), + instapaper: site('instapaper', 'instapaper', 'http://www.instapaper.com/text?u=' + url), + line: site('LINE', 'comment', 'http://line.me/R/msg/text/?' + title + ' ' + url), + linkedin: site('Linkedin', 'linkedin', 'https://www.linkedin.com/shareArticle?mini=true&url=' + url), + messenger: site('Facebook Messenger', 'commenting', 'fb-messenger://share?link=' + url), + pocket: site('Pocket', 'get-pocket', 'https://getpocket.com/save?url=' + url + '&title=' + title), + qq: site('QQ', 'qq', 'http://connect.qq.com/widget/shareqq/index.html?url=' + url + '&title=' + title), + qzone: site('QQ空间', 'star', 'http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url=' + url + '&title=' + title), + stumbleupon: site('StumbleUpon', 'stumbleupon', 'http://www.stumbleupon.com/submit?url=' + url + '&title=' + title), + twitter: site('Twitter', 'twitter', 'https://twitter.com/intent/tweet?url=' + title + '&text=' + title), + viber: site('Viber', 'volume-control-phone', 'viber://forward?text='+ url + ' ' + title), + vk: site('VK', 'vk', 'http://vkontakte.ru/share.php?url=' + url), + weibo: site('新浪微博', 'weibo', 'http://service.weibo.com/share/share.php?content=utf-8&url=' + url + '&title=' + title), + whatsapp: site('WhatsApp', 'whatsapp', 'whatsapp://send?text='+ url + ' ' + title), + }; + + gitbook.events.bind('start', function(e, config) { + var opts = config.sharing; + + // Create dropdown menu + var menu = $.map(opts.all, function(id) { + var site = SITES[id]; + + return { + text: site.label, + onClick: site.onClick + }; + }); + + // Create main button with dropdown + if (menu.length > 0) { + gitbook.toolbar.createButton({ + icon: 'fa fa-share-alt', + label: 'Share', + position: 'right', + dropdown: [menu] + }); + } + + // Direct actions to share + $.each(SITES, function(sideId, site) { + if (!opts[sideId]) return; + + gitbook.toolbar.createButton({ + icon: site.icon, + label: site.text, + position: 'right', + onClick: site.onClick + }); + }); + }); +}); diff --git a/gitbook/gitbook-plugin-splitter/splitter.css b/gitbook/gitbook-plugin-splitter/splitter.css new file mode 100644 index 0000000..4e84720 --- /dev/null +++ b/gitbook/gitbook-plugin-splitter/splitter.css @@ -0,0 +1,22 @@ +.divider-content-summary { + position: absolute; + top: 0; + right: 0; + height: 100%; + width: 5px; + display: table; + cursor: col-resize; + color: #ccc; + -webkit-transition: color 350ms ease; + -moz-transition: color 350ms ease; + -o-transition: color 350ms ease; + transition: color 350ms ease +} +.divider-content-summary:hover { + color: #444; +} + .divider-content-summary__icon { + display: table-cell; + vertical-align: middle; + text-align: center; + } diff --git a/gitbook/gitbook-plugin-splitter/splitter.js b/gitbook/gitbook-plugin-splitter/splitter.js new file mode 100644 index 0000000..5034e5b --- /dev/null +++ b/gitbook/gitbook-plugin-splitter/splitter.js @@ -0,0 +1,128 @@ +require(['gitbook', 'jQuery'], function (gitbook, $) { + + // MEMO: + // Gitbook is calculated as "calc (100% - 60px)" in the horizontal width when the width of the screen size is 600px + // or less. + // In this case, since contradiction occurs in the implementation of this module, return. + if($(window).width() <= 600) { + return; + } + + gitbook.events.bind('start', function () { + }); + + gitbook.events.bind('page.change', function () { + + var KEY_SPLIT_STATE = 'plugin_gitbook_split'; + + var dividerWidth = null; + var isDraggable = false; + var dividerCenterOffsetLeft = null; + var splitState = null; + var grabPointWidth = null; + + var $body = $('body'); + var $book = $('.book'); + var $summary = $('.book-summary'); + var $bookBody = $('.book-body'); + var $divider = $('

    ' + + '
    ' + + '' + + '
    ' + + '
    '); + + $summary.append($divider); + + dividerWidth = $divider.outerWidth(); + dividerCenterOffsetLeft = $divider.outerWidth() / 2; + + // restore split state from sessionStorage + splitState = getSplitState(); + setSplitState( + splitState.summaryWidth, + splitState.summaryOffset, + splitState.bookBodyOffset + ); + + setTimeout(function() { + var isGreaterThanEqualGitbookV2_5 = !Boolean($('.toggle-summary').length); + + var $toggleSummary = isGreaterThanEqualGitbookV2_5 + ? $('.fa.fa-align-justify').parent() : $('.toggle-summary'); + + $toggleSummary.on('click', function () { + + var summaryOffset = null; + var bookBodyOffset = null; + + var isOpen = isGreaterThanEqualGitbookV2_5 + ? !gitbook.sidebar.isOpen() : $book.hasClass('with-summary'); + + if (isOpen) { + summaryOffset = -($summary.outerWidth()); + bookBodyOffset = 0; + } else { + summaryOffset = 0; + bookBodyOffset = $summary.outerWidth(); + } + + setSplitState($summary.outerWidth(), summaryOffset, bookBodyOffset); + saveSplitState($summary.outerWidth(), summaryOffset, bookBodyOffset); + }); + }, 1); + + $divider.on('mousedown', function (event) { + event.stopPropagation(); + isDraggable = true; + grabPointWidth = $summary.outerWidth() - event.pageX; + }); + + $body.on('mouseup', function (event) { + event.stopPropagation(); + isDraggable = false; + saveSplitState( + $summary.outerWidth(), + $summary.position().left, + $bookBody.position().left + ); + }); + + $body.on('mousemove', function (event) { + if (!isDraggable) { + return; + } + event.stopPropagation(); + event.preventDefault(); + $summary.outerWidth(event.pageX + grabPointWidth); + $bookBody.offset({ left: event.pageX + grabPointWidth }); + }); + + function getSplitState() { + var splitState = JSON.parse(sessionStorage.getItem(KEY_SPLIT_STATE)); + splitState || (splitState = {}); + splitState.summaryWidth || (splitState.summaryWidth = $summary.outerWidth()); + splitState.summaryOffset || (splitState.summaryOffset = $summary.position().left); + splitState.bookBodyOffset || (splitState.bookBodyOffset = $bookBody.position().left); + return splitState; + } + + function saveSplitState(summaryWidth, summaryWidthOffset, bookBodyOffset) { + sessionStorage.setItem(KEY_SPLIT_STATE, JSON.stringify({ + summaryWidth: summaryWidth, + summaryOffset: summaryWidthOffset, + bookBodyOffset: bookBodyOffset, + })); + } + + function setSplitState(summaryWidth, summaryOffset, bookBodyOffset) { + $summary.outerWidth(summaryWidth); + $summary.offset({ left: summaryOffset }); + $bookBody.offset({ left: bookBodyOffset }); + // improved broken layout in windows chrome. + // "$(x).offset" automatically add to "position:relative". + // but it cause layout broken.. + $summary.css({ position: 'absolute' }); + $bookBody.css({ position: 'absolute' }); + } + }); +}); diff --git a/gitbook/gitbook-plugin-tbfed-pagefooter/footer.css b/gitbook/gitbook-plugin-tbfed-pagefooter/footer.css new file mode 100644 index 0000000..5205266 --- /dev/null +++ b/gitbook/gitbook-plugin-tbfed-pagefooter/footer.css @@ -0,0 +1,15 @@ +.page-footer { + margin-top: 50px; + border-top: 1px solid #ccc; + overflow: hidden; + padding: 10px 0; + font-size: 12px; + color: #808080; +} +.page-footer a { + color: #808080!important; + text-decoration: underline!important; +} +.footer-modification { + float: right; +} diff --git a/gitbook/gitbook.js b/gitbook/gitbook.js new file mode 100644 index 0000000..13077b4 --- /dev/null +++ b/gitbook/gitbook.js @@ -0,0 +1,4 @@ +!function e(t,n,r){function o(s,a){if(!n[s]){if(!t[s]){var u="function"==typeof require&&require;if(!a&&u)return u(s,!0);if(i)return i(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var l=n[s]={exports:{}};t[s][0].call(l.exports,function(e){var n=t[s][1][e];return o(n?n:e)},l,l.exports,e,t,n,r)}return n[s].exports}for(var i="function"==typeof require&&require,s=0;s0&&t-1 in e)}function o(e,t,n){return de.isFunction(t)?de.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?de.grep(e,function(e){return e===t!==n}):"string"!=typeof t?de.grep(e,function(e){return se.call(t,e)>-1!==n}):je.test(t)?de.filter(t,e,n):(t=de.filter(t,e),de.grep(e,function(e){return se.call(t,e)>-1!==n&&1===e.nodeType}))}function i(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}function s(e){var t={};return de.each(e.match(qe)||[],function(e,n){t[n]=!0}),t}function a(e){return e}function u(e){throw e}function c(e,t,n){var r;try{e&&de.isFunction(r=e.promise)?r.call(e).done(t).fail(n):e&&de.isFunction(r=e.then)?r.call(e,t,n):t.call(void 0,e)}catch(e){n.call(void 0,e)}}function l(){te.removeEventListener("DOMContentLoaded",l),e.removeEventListener("load",l),de.ready()}function f(){this.expando=de.expando+f.uid++}function p(e){return"true"===e||"false"!==e&&("null"===e?null:e===+e+""?+e:Ie.test(e)?JSON.parse(e):e)}function h(e,t,n){var r;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(Pe,"-$&").toLowerCase(),n=e.getAttribute(r),"string"==typeof n){try{n=p(n)}catch(e){}Re.set(e,t,n)}else n=void 0;return n}function d(e,t,n,r){var o,i=1,s=20,a=r?function(){return r.cur()}:function(){return de.css(e,t,"")},u=a(),c=n&&n[3]||(de.cssNumber[t]?"":"px"),l=(de.cssNumber[t]||"px"!==c&&+u)&&$e.exec(de.css(e,t));if(l&&l[3]!==c){c=c||l[3],n=n||[],l=+u||1;do i=i||".5",l/=i,de.style(e,t,l+c);while(i!==(i=a()/u)&&1!==i&&--s)}return n&&(l=+l||+u||0,o=n[1]?l+(n[1]+1)*n[2]:+n[2],r&&(r.unit=c,r.start=l,r.end=o)),o}function g(e){var t,n=e.ownerDocument,r=e.nodeName,o=Ue[r];return o?o:(t=n.body.appendChild(n.createElement(r)),o=de.css(t,"display"),t.parentNode.removeChild(t),"none"===o&&(o="block"),Ue[r]=o,o)}function m(e,t){for(var n,r,o=[],i=0,s=e.length;i-1)o&&o.push(i);else if(c=de.contains(i.ownerDocument,i),s=v(f.appendChild(i),"script"),c&&y(s),n)for(l=0;i=s[l++];)Ve.test(i.type||"")&&n.push(i);return f}function b(){return!0}function w(){return!1}function T(){try{return te.activeElement}catch(e){}}function C(e,t,n,r,o,i){var s,a;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(a in t)C(e,a,n,r,t[a],i);return e}if(null==r&&null==o?(o=n,r=n=void 0):null==o&&("string"==typeof n?(o=r,r=void 0):(o=r,r=n,n=void 0)),o===!1)o=w;else if(!o)return e;return 1===i&&(s=o,o=function(e){return de().off(e),s.apply(this,arguments)},o.guid=s.guid||(s.guid=de.guid++)),e.each(function(){de.event.add(this,t,o,r,n)})}function j(e,t){return de.nodeName(e,"table")&&de.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e:e}function k(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function E(e){var t=rt.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function S(e,t){var n,r,o,i,s,a,u,c;if(1===t.nodeType){if(Fe.hasData(e)&&(i=Fe.access(e),s=Fe.set(t,i),c=i.events)){delete s.handle,s.events={};for(o in c)for(n=0,r=c[o].length;n1&&"string"==typeof d&&!pe.checkClone&&nt.test(d))return e.each(function(n){var i=e.eq(n);g&&(t[0]=d.call(this,n,i.html())),A(i,t,r,o)});if(p&&(i=x(t,e[0].ownerDocument,!1,e,o),s=i.firstChild,1===i.childNodes.length&&(i=s),s||o)){for(a=de.map(v(i,"script"),k),u=a.length;f=0&&nC.cacheLength&&delete e[t.shift()],e[n+" "]=r}var t=[];return e}function r(e){return e[$]=!0,e}function o(e){var t=L.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function i(e,t){for(var n=e.split("|"),r=n.length;r--;)C.attrHandle[n[r]]=t}function s(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function a(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function u(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function c(e){return function(t){return"form"in t?t.parentNode&&t.disabled===!1?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&je(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function l(e){return r(function(t){return t=+t,r(function(n,r){for(var o,i=e([],n.length,t),s=i.length;s--;)n[o=i[s]]&&(n[o]=!(r[o]=n[o]))})})}function f(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function p(){}function h(e){for(var t=0,n=e.length,r="";t1?function(t,n,r){for(var o=e.length;o--;)if(!e[o](t,n,r))return!1;return!0}:e[0]}function m(e,n,r){for(var o=0,i=n.length;o-1&&(r[c]=!(s[c]=f))}}else x=v(x===s?x.splice(d,x.length):x),i?i(null,s,x,u):K.apply(s,x)})}function x(e){for(var t,n,r,o=e.length,i=C.relative[e[0].type],s=i||C.relative[" "],a=i?1:0,u=d(function(e){return e===t},s,!0),c=d(function(e){return ee(t,e)>-1},s,!0),l=[function(e,n,r){var o=!i&&(r||n!==A)||((t=n).nodeType?u(e,n,r):c(e,n,r));return t=null,o}];a1&&g(l),a>1&&h(e.slice(0,a-1).concat({value:" "===e[a-2].type?"*":""})).replace(ae,"$1"),n,a0,i=e.length>0,s=function(r,s,a,u,c){var l,f,p,h=0,d="0",g=r&&[],m=[],y=A,x=r||i&&C.find.TAG("*",c),b=B+=null==y?1:Math.random()||.1,w=x.length;for(c&&(A=s===L||s||c);d!==w&&null!=(l=x[d]);d++){if(i&&l){for(f=0,s||l.ownerDocument===L||(O(l),a=!F);p=e[f++];)if(p(l,s||L,a)){u.push(l);break}c&&(B=b)}o&&((l=!p&&l)&&h--,r&&g.push(l))}if(h+=d,o&&d!==h){for(f=0;p=n[f++];)p(g,m,s,a);if(r){if(h>0)for(;d--;)g[d]||m[d]||(m[d]=Q.call(u));m=v(m)}K.apply(u,m),c&&!r&&m.length>0&&h+n.length>1&&t.uniqueSort(u)}return c&&(B=b,A=y),g};return o?r(s):s}var w,T,C,j,k,E,S,N,A,q,D,O,L,H,F,R,I,P,M,$="sizzle"+1*new Date,W=e.document,B=0,_=0,U=n(),z=n(),X=n(),V=function(e,t){return e===t&&(D=!0),0},G={}.hasOwnProperty,Y=[],Q=Y.pop,J=Y.push,K=Y.push,Z=Y.slice,ee=function(e,t){for(var n=0,r=e.length;n+~]|"+ne+")"+ne+"*"),le=new RegExp("="+ne+"*([^\\]'\"]*?)"+ne+"*\\]","g"),fe=new RegExp(ie),pe=new RegExp("^"+re+"$"),he={ID:new RegExp("^#("+re+")"),CLASS:new RegExp("^\\.("+re+")"),TAG:new RegExp("^("+re+"|[*])"),ATTR:new RegExp("^"+oe),PSEUDO:new RegExp("^"+ie),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ne+"*(even|odd|(([+-]|)(\\d*)n|)"+ne+"*(?:([+-]|)"+ne+"*(\\d+)|))"+ne+"*\\)|)","i"),bool:new RegExp("^(?:"+te+")$","i"),needsContext:new RegExp("^"+ne+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ne+"*((?:-\\d)?\\d*)"+ne+"*\\)|)(?=[^-]|$)","i")},de=/^(?:input|select|textarea|button)$/i,ge=/^h\d$/i,me=/^[^{]+\{\s*\[native \w/,ve=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ye=/[+~]/,xe=new RegExp("\\\\([\\da-f]{1,6}"+ne+"?|("+ne+")|.)","ig"),be=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},we=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,Te=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},Ce=function(){O()},je=d(function(e){return e.disabled===!0&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{K.apply(Y=Z.call(W.childNodes),W.childNodes),Y[W.childNodes.length].nodeType}catch(e){K={apply:Y.length?function(e,t){J.apply(e,Z.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}T=t.support={},k=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},O=t.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:W;return r!==L&&9===r.nodeType&&r.documentElement?(L=r,H=L.documentElement,F=!k(L),W!==L&&(n=L.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",Ce,!1):n.attachEvent&&n.attachEvent("onunload",Ce)),T.attributes=o(function(e){return e.className="i",!e.getAttribute("className")}),T.getElementsByTagName=o(function(e){return e.appendChild(L.createComment("")),!e.getElementsByTagName("*").length}),T.getElementsByClassName=me.test(L.getElementsByClassName),T.getById=o(function(e){return H.appendChild(e).id=$,!L.getElementsByName||!L.getElementsByName($).length}),T.getById?(C.filter.ID=function(e){var t=e.replace(xe,be);return function(e){return e.getAttribute("id")===t}},C.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&F){var n=t.getElementById(e);return n?[n]:[]}}):(C.filter.ID=function(e){var t=e.replace(xe,be);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},C.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&F){var n,r,o,i=t.getElementById(e);if(i){if(n=i.getAttributeNode("id"),n&&n.value===e)return[i];for(o=t.getElementsByName(e),r=0;i=o[r++];)if(n=i.getAttributeNode("id"),n&&n.value===e)return[i]}return[]}}),C.find.TAG=T.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):T.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],o=0,i=t.getElementsByTagName(e);if("*"===e){for(;n=i[o++];)1===n.nodeType&&r.push(n);return r}return i},C.find.CLASS=T.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&F)return t.getElementsByClassName(e)},I=[],R=[],(T.qsa=me.test(L.querySelectorAll))&&(o(function(e){H.appendChild(e).innerHTML="
    ",e.querySelectorAll("[msallowcapture^='']").length&&R.push("[*^$]="+ne+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||R.push("\\["+ne+"*(?:value|"+te+")"),e.querySelectorAll("[id~="+$+"-]").length||R.push("~="),e.querySelectorAll(":checked").length||R.push(":checked"),e.querySelectorAll("a#"+$+"+*").length||R.push(".#.+[+~]")}),o(function(e){e.innerHTML="";var t=L.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&R.push("name"+ne+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&R.push(":enabled",":disabled"),H.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&R.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),R.push(",.*:")})),(T.matchesSelector=me.test(P=H.matches||H.webkitMatchesSelector||H.mozMatchesSelector||H.oMatchesSelector||H.msMatchesSelector))&&o(function(e){T.disconnectedMatch=P.call(e,"*"),P.call(e,"[s!='']:x"),I.push("!=",ie)}),R=R.length&&new RegExp(R.join("|")),I=I.length&&new RegExp(I.join("|")),t=me.test(H.compareDocumentPosition),M=t||me.test(H.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},V=t?function(e,t){if(e===t)return D=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!T.sortDetached&&t.compareDocumentPosition(e)===n?e===L||e.ownerDocument===W&&M(W,e)?-1:t===L||t.ownerDocument===W&&M(W,t)?1:q?ee(q,e)-ee(q,t):0:4&n?-1:1)}:function(e,t){if(e===t)return D=!0,0;var n,r=0,o=e.parentNode,i=t.parentNode,a=[e],u=[t];if(!o||!i)return e===L?-1:t===L?1:o?-1:i?1:q?ee(q,e)-ee(q,t):0;if(o===i)return s(e,t);for(n=e;n=n.parentNode;)a.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;a[r]===u[r];)r++;return r?s(a[r],u[r]):a[r]===W?-1:u[r]===W?1:0},L):L},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==L&&O(e),n=n.replace(le,"='$1']"),T.matchesSelector&&F&&!X[n+" "]&&(!I||!I.test(n))&&(!R||!R.test(n)))try{var r=P.call(e,n);if(r||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return t(n,L,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==L&&O(e),M(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==L&&O(e);var n=C.attrHandle[t.toLowerCase()],r=n&&G.call(C.attrHandle,t.toLowerCase())?n(e,t,!F):void 0;return void 0!==r?r:T.attributes||!F?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},t.escape=function(e){return(e+"").replace(we,Te)},t.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},t.uniqueSort=function(e){var t,n=[],r=0,o=0;if(D=!T.detectDuplicates,q=!T.sortStable&&e.slice(0),e.sort(V),D){for(;t=e[o++];)t===e[o]&&(r=n.push(o));for(;r--;)e.splice(n[r],1)}return q=null,e},j=t.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=j(e)}else if(3===o||4===o)return e.nodeValue}else for(;t=e[r++];)n+=j(t);return n},C=t.selectors={cacheLength:50,createPseudo:r,match:he,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(xe,be),e[3]=(e[3]||e[4]||e[5]||"").replace(xe,be),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||t.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return he.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&fe.test(n)&&(t=E(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(xe,be).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=U[e+" "];return t||(t=new RegExp("(^|"+ne+")"+e+"("+ne+"|$)"))&&U(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,n,r){return function(o){var i=t.attr(o,e);return null==i?"!="===n:!n||(i+="","="===n?i===r:"!="===n?i!==r:"^="===n?r&&0===i.indexOf(r):"*="===n?r&&i.indexOf(r)>-1:"$="===n?r&&i.slice(-r.length)===r:"~="===n?(" "+i.replace(se," ")+" ").indexOf(r)>-1:"|="===n&&(i===r||i.slice(0,r.length+1)===r+"-"))}},CHILD:function(e,t,n,r,o){var i="nth"!==e.slice(0,3),s="last"!==e.slice(-4),a="of-type"===t;return 1===r&&0===o?function(e){return!!e.parentNode}:function(t,n,u){var c,l,f,p,h,d,g=i!==s?"nextSibling":"previousSibling",m=t.parentNode,v=a&&t.nodeName.toLowerCase(),y=!u&&!a,x=!1;if(m){if(i){for(;g;){for(p=t;p=p[g];)if(a?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;d=g="only"===e&&!d&&"nextSibling"}return!0}if(d=[s?m.firstChild:m.lastChild],s&&y){for(p=m,f=p[$]||(p[$]={}),l=f[p.uniqueID]||(f[p.uniqueID]={}),c=l[e]||[],h=c[0]===B&&c[1],x=h&&c[2],p=h&&m.childNodes[h];p=++h&&p&&p[g]||(x=h=0)||d.pop();)if(1===p.nodeType&&++x&&p===t){l[e]=[B,h,x];break}}else if(y&&(p=t,f=p[$]||(p[$]={}),l=f[p.uniqueID]||(f[p.uniqueID]={}),c=l[e]||[],h=c[0]===B&&c[1],x=h),x===!1)for(;(p=++h&&p&&p[g]||(x=h=0)||d.pop())&&((a?p.nodeName.toLowerCase()!==v:1!==p.nodeType)||!++x||(y&&(f=p[$]||(p[$]={}),l=f[p.uniqueID]||(f[p.uniqueID]={}),l[e]=[B,x]),p!==t)););return x-=o,x===r||x%r===0&&x/r>=0}}},PSEUDO:function(e,n){var o,i=C.pseudos[e]||C.setFilters[e.toLowerCase()]||t.error("unsupported pseudo: "+e);return i[$]?i(n):i.length>1?(o=[e,e,"",n],C.setFilters.hasOwnProperty(e.toLowerCase())?r(function(e,t){for(var r,o=i(e,n),s=o.length;s--;)r=ee(e,o[s]),e[r]=!(t[r]=o[s])}):function(e){return i(e,0,o)}):i}},pseudos:{not:r(function(e){var t=[],n=[],o=S(e.replace(ae,"$1"));return o[$]?r(function(e,t,n,r){for(var i,s=o(e,null,r,[]),a=e.length;a--;)(i=s[a])&&(e[a]=!(t[a]=i))}):function(e,r,i){return t[0]=e,o(t,null,i,n),t[0]=null,!n.pop()}}),has:r(function(e){return function(n){ +return t(e,n).length>0}}),contains:r(function(e){return e=e.replace(xe,be),function(t){return(t.textContent||t.innerText||j(t)).indexOf(e)>-1}}),lang:r(function(e){return pe.test(e||"")||t.error("unsupported lang: "+e),e=e.replace(xe,be).toLowerCase(),function(t){var n;do if(n=F?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===H},focus:function(e){return e===L.activeElement&&(!L.hasFocus||L.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:c(!1),disabled:c(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!C.pseudos.empty(e)},header:function(e){return ge.test(e.nodeName)},input:function(e){return de.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:l(function(){return[0]}),last:l(function(e,t){return[t-1]}),eq:l(function(e,t,n){return[n<0?n+t:n]}),even:l(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:l(function(e,t,n){for(var r=n<0?n+t:n;++r2&&"ID"===(s=i[0]).type&&9===t.nodeType&&F&&C.relative[i[1].type]){if(t=(C.find.ID(s.matches[0].replace(xe,be),t)||[])[0],!t)return n;c&&(t=t.parentNode),e=e.slice(i.shift().value.length)}for(o=he.needsContext.test(e)?0:i.length;o--&&(s=i[o],!C.relative[a=s.type]);)if((u=C.find[a])&&(r=u(s.matches[0].replace(xe,be),ye.test(i[0].type)&&f(t.parentNode)||t))){if(i.splice(o,1),e=r.length&&h(i),!e)return K.apply(n,r),n;break}}return(c||S(e,l))(r,t,!F,n,!t||ye.test(e)&&f(t.parentNode)||t),n},T.sortStable=$.split("").sort(V).join("")===$,T.detectDuplicates=!!D,O(),T.sortDetached=o(function(e){return 1&e.compareDocumentPosition(L.createElement("fieldset"))}),o(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||i("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),T.attributes&&o(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||i("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),o(function(e){return null==e.getAttribute("disabled")})||i(te,function(e,t,n){var r;if(!n)return e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(e);de.find=xe,de.expr=xe.selectors,de.expr[":"]=de.expr.pseudos,de.uniqueSort=de.unique=xe.uniqueSort,de.text=xe.getText,de.isXMLDoc=xe.isXML,de.contains=xe.contains,de.escapeSelector=xe.escape;var be=function(e,t,n){for(var r=[],o=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(o&&de(e).is(n))break;r.push(e)}return r},we=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},Te=de.expr.match.needsContext,Ce=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,je=/^.[^:#\[\.,]*$/;de.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?de.find.matchesSelector(r,e)?[r]:[]:de.find.matches(e,de.grep(t,function(e){return 1===e.nodeType}))},de.fn.extend({find:function(e){var t,n,r=this.length,o=this;if("string"!=typeof e)return this.pushStack(de(e).filter(function(){for(t=0;t1?de.uniqueSort(n):n},filter:function(e){return this.pushStack(o(this,e||[],!1))},not:function(e){return this.pushStack(o(this,e||[],!0))},is:function(e){return!!o(this,"string"==typeof e&&Te.test(e)?de(e):e||[],!1).length}});var ke,Ee=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,Se=de.fn.init=function(e,t,n){var r,o;if(!e)return this;if(n=n||ke,"string"==typeof e){if(r="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:Ee.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof de?t[0]:t,de.merge(this,de.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:te,!0)),Ce.test(r[1])&&de.isPlainObject(t))for(r in t)de.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return o=te.getElementById(r[2]),o&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):de.isFunction(e)?void 0!==n.ready?n.ready(e):e(de):de.makeArray(e,this)};Se.prototype=de.fn,ke=de(te);var Ne=/^(?:parents|prev(?:Until|All))/,Ae={children:!0,contents:!0,next:!0,prev:!0};de.fn.extend({has:function(e){var t=de(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&de.find.matchesSelector(n,e))){i.push(n);break}return this.pushStack(i.length>1?de.uniqueSort(i):i)},index:function(e){return e?"string"==typeof e?se.call(de(e),this[0]):se.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(de.uniqueSort(de.merge(this.get(),de(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),de.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return be(e,"parentNode")},parentsUntil:function(e,t,n){return be(e,"parentNode",n)},next:function(e){return i(e,"nextSibling")},prev:function(e){return i(e,"previousSibling")},nextAll:function(e){return be(e,"nextSibling")},prevAll:function(e){return be(e,"previousSibling")},nextUntil:function(e,t,n){return be(e,"nextSibling",n)},prevUntil:function(e,t,n){return be(e,"previousSibling",n)},siblings:function(e){return we((e.parentNode||{}).firstChild,e)},children:function(e){return we(e.firstChild)},contents:function(e){return e.contentDocument||de.merge([],e.childNodes)}},function(e,t){de.fn[e]=function(n,r){var o=de.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(o=de.filter(r,o)),this.length>1&&(Ae[e]||de.uniqueSort(o),Ne.test(e)&&o.reverse()),this.pushStack(o)}});var qe=/[^\x20\t\r\n\f]+/g;de.Callbacks=function(e){e="string"==typeof e?s(e):de.extend({},e);var t,n,r,o,i=[],a=[],u=-1,c=function(){for(o=e.once,r=t=!0;a.length;u=-1)for(n=a.shift();++u-1;)i.splice(n,1),n<=u&&u--}),this},has:function(e){return e?de.inArray(e,i)>-1:i.length>0},empty:function(){return i&&(i=[]),this},disable:function(){return o=a=[],i=n="",this},disabled:function(){return!i},lock:function(){return o=a=[],n||t||(i=n=""),this},locked:function(){return!!o},fireWith:function(e,n){return o||(n=n||[],n=[e,n.slice?n.slice():n],a.push(n),t||c()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l},de.extend({Deferred:function(t){var n=[["notify","progress",de.Callbacks("memory"),de.Callbacks("memory"),2],["resolve","done",de.Callbacks("once memory"),de.Callbacks("once memory"),0,"resolved"],["reject","fail",de.Callbacks("once memory"),de.Callbacks("once memory"),1,"rejected"]],r="pending",o={state:function(){return r},always:function(){return i.done(arguments).fail(arguments),this},catch:function(e){return o.then(null,e)},pipe:function(){var e=arguments;return de.Deferred(function(t){de.each(n,function(n,r){var o=de.isFunction(e[r[4]])&&e[r[4]];i[r[1]](function(){var e=o&&o.apply(this,arguments);e&&de.isFunction(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,o?[e]:arguments)})}),e=null}).promise()},then:function(t,r,o){function i(t,n,r,o){return function(){var c=this,l=arguments,f=function(){var e,f;if(!(t=s&&(r!==u&&(c=void 0,l=[e]),n.rejectWith(c,l))}};t?p():(de.Deferred.getStackHook&&(p.stackTrace=de.Deferred.getStackHook()),e.setTimeout(p))}}var s=0;return de.Deferred(function(e){n[0][3].add(i(0,e,de.isFunction(o)?o:a,e.notifyWith)),n[1][3].add(i(0,e,de.isFunction(t)?t:a)),n[2][3].add(i(0,e,de.isFunction(r)?r:u))}).promise()},promise:function(e){return null!=e?de.extend(e,o):o}},i={};return de.each(n,function(e,t){var s=t[2],a=t[5];o[t[1]]=s.add,a&&s.add(function(){r=a},n[3-e][2].disable,n[0][2].lock),s.add(t[3].fire),i[t[0]]=function(){return i[t[0]+"With"](this===i?void 0:this,arguments),this},i[t[0]+"With"]=s.fireWith}),o.promise(i),t&&t.call(i,i),i},when:function(e){var t=arguments.length,n=t,r=Array(n),o=re.call(arguments),i=de.Deferred(),s=function(e){return function(n){r[e]=this,o[e]=arguments.length>1?re.call(arguments):n,--t||i.resolveWith(r,o)}};if(t<=1&&(c(e,i.done(s(n)).resolve,i.reject),"pending"===i.state()||de.isFunction(o[n]&&o[n].then)))return i.then();for(;n--;)c(o[n],s(n),i.reject);return i.promise()}});var De=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;de.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&De.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},de.readyException=function(t){e.setTimeout(function(){throw t})};var Oe=de.Deferred();de.fn.ready=function(e){return Oe.then(e).catch(function(e){de.readyException(e)}),this},de.extend({isReady:!1,readyWait:1,holdReady:function(e){e?de.readyWait++:de.ready(!0)},ready:function(e){(e===!0?--de.readyWait:de.isReady)||(de.isReady=!0,e!==!0&&--de.readyWait>0||Oe.resolveWith(te,[de]))}}),de.ready.then=Oe.then,"complete"===te.readyState||"loading"!==te.readyState&&!te.documentElement.doScroll?e.setTimeout(de.ready):(te.addEventListener("DOMContentLoaded",l),e.addEventListener("load",l));var Le=function(e,t,n,r,o,i,s){var a=0,u=e.length,c=null==n;if("object"===de.type(n)){o=!0;for(a in n)Le(e,t,a,n[a],!0,i,s)}else if(void 0!==r&&(o=!0,de.isFunction(r)||(s=!0),c&&(s?(t.call(e,r),t=null):(c=t,t=function(e,t,n){return c.call(de(e),n)})),t))for(;a1,null,!0)},removeData:function(e){return this.each(function(){Re.remove(this,e)})}}),de.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Fe.get(e,t),n&&(!r||de.isArray(n)?r=Fe.access(e,t,de.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=de.queue(e,t),r=n.length,o=n.shift(),i=de._queueHooks(e,t),s=function(){de.dequeue(e,t)};"inprogress"===o&&(o=n.shift(),r--),o&&("fx"===t&&n.unshift("inprogress"),delete i.stop,o.call(e,s,i)),!r&&i&&i.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Fe.get(e,n)||Fe.access(e,n,{empty:de.Callbacks("once memory").add(function(){Fe.remove(e,[t+"queue",n])})})}}),de.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]+)/i,Ve=/^$|\/(?:java|ecma)script/i,Ge={option:[1,""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};Ge.optgroup=Ge.option,Ge.tbody=Ge.tfoot=Ge.colgroup=Ge.caption=Ge.thead,Ge.th=Ge.td;var Ye=/<|&#?\w+;/;!function(){var e=te.createDocumentFragment(),t=e.appendChild(te.createElement("div")),n=te.createElement("input");n.setAttribute("type","radio"),n.setAttribute("checked","checked"),n.setAttribute("name","t"),t.appendChild(n),pe.checkClone=t.cloneNode(!0).cloneNode(!0).lastChild.checked,t.innerHTML="",pe.noCloneChecked=!!t.cloneNode(!0).lastChild.defaultValue}();var Qe=te.documentElement,Je=/^key/,Ke=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ze=/^([^.]*)(?:\.(.+)|)/;de.event={global:{},add:function(e,t,n,r,o){var i,s,a,u,c,l,f,p,h,d,g,m=Fe.get(e);if(m)for(n.handler&&(i=n,n=i.handler,o=i.selector),o&&de.find.matchesSelector(Qe,o),n.guid||(n.guid=de.guid++),(u=m.events)||(u=m.events={}),(s=m.handle)||(s=m.handle=function(t){return"undefined"!=typeof de&&de.event.triggered!==t.type?de.event.dispatch.apply(e,arguments):void 0}),t=(t||"").match(qe)||[""],c=t.length;c--;)a=Ze.exec(t[c])||[],h=g=a[1],d=(a[2]||"").split(".").sort(),h&&(f=de.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=de.event.special[h]||{},l=de.extend({type:h,origType:g,data:r,handler:n,guid:n.guid,selector:o,needsContext:o&&de.expr.match.needsContext.test(o),namespace:d.join(".")},i),(p=u[h])||(p=u[h]=[],p.delegateCount=0,f.setup&&f.setup.call(e,r,d,s)!==!1||e.addEventListener&&e.addEventListener(h,s)),f.add&&(f.add.call(e,l),l.handler.guid||(l.handler.guid=n.guid)),o?p.splice(p.delegateCount++,0,l):p.push(l),de.event.global[h]=!0)},remove:function(e,t,n,r,o){var i,s,a,u,c,l,f,p,h,d,g,m=Fe.hasData(e)&&Fe.get(e);if(m&&(u=m.events)){for(t=(t||"").match(qe)||[""],c=t.length;c--;)if(a=Ze.exec(t[c])||[],h=g=a[1],d=(a[2]||"").split(".").sort(),h){for(f=de.event.special[h]||{},h=(r?f.delegateType:f.bindType)||h,p=u[h]||[],a=a[2]&&new RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=i=p.length;i--;)l=p[i],!o&&g!==l.origType||n&&n.guid!==l.guid||a&&!a.test(l.namespace)||r&&r!==l.selector&&("**"!==r||!l.selector)||(p.splice(i,1),l.selector&&p.delegateCount--,f.remove&&f.remove.call(e,l));s&&!p.length&&(f.teardown&&f.teardown.call(e,d,m.handle)!==!1||de.removeEvent(e,h,m.handle),delete u[h])}else for(h in u)de.event.remove(e,h+t[c],n,r,!0);de.isEmptyObject(u)&&Fe.remove(e,"handle events")}},dispatch:function(e){var t,n,r,o,i,s,a=de.event.fix(e),u=new Array(arguments.length),c=(Fe.get(this,"events")||{})[a.type]||[],l=de.event.special[a.type]||{};for(u[0]=a,t=1;t=1))for(;c!==this;c=c.parentNode||this)if(1===c.nodeType&&("click"!==e.type||c.disabled!==!0)){for(i=[],s={},n=0;n-1:de.find(o,this,null,[c]).length),s[o]&&i.push(r);i.length&&a.push({elem:c,handlers:i})}return c=this,u\x20\t\r\n\f]*)[^>]*)\/>/gi,tt=/\s*$/g;de.extend({htmlPrefilter:function(e){return e.replace(et,"<$1>")},clone:function(e,t,n){var r,o,i,s,a=e.cloneNode(!0),u=de.contains(e.ownerDocument,e);if(!(pe.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||de.isXMLDoc(e)))for(s=v(a),i=v(e),r=0,o=i.length;r0&&y(s,!u&&v(e,"script")),a},cleanData:function(e){for(var t,n,r,o=de.event.special,i=0;void 0!==(n=e[i]);i++)if(He(n)){if(t=n[Fe.expando]){if(t.events)for(r in t.events)o[r]?de.event.remove(n,r):de.removeEvent(n,r,t.handle);n[Fe.expando]=void 0}n[Re.expando]&&(n[Re.expando]=void 0)}}}),de.fn.extend({detach:function(e){return q(this,e,!0)},remove:function(e){return q(this,e)},text:function(e){return Le(this,function(e){return void 0===e?de.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return A(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=j(this,e);t.appendChild(e)}})},prepend:function(){return A(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=j(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return A(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return A(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(de.cleanData(v(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return de.clone(this,e,t)})},html:function(e){return Le(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!tt.test(e)&&!Ge[(Xe.exec(e)||["",""])[1].toLowerCase()]){e=de.htmlPrefilter(e);try{for(;n1)}}),de.Tween=I,I.prototype={constructor:I,init:function(e,t,n,r,o,i){this.elem=e,this.prop=n,this.easing=o||de.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=i||(de.cssNumber[n]?"":"px")},cur:function(){var e=I.propHooks[this.prop];return e&&e.get?e.get(this):I.propHooks._default.get(this)},run:function(e){var t,n=I.propHooks[this.prop];return this.options.duration?this.pos=t=de.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):I.propHooks._default.set(this),this}},I.prototype.init.prototype=I.prototype,I.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=de.css(e.elem,e.prop,""),t&&"auto"!==t?t:0)},set:function(e){de.fx.step[e.prop]?de.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[de.cssProps[e.prop]]&&!de.cssHooks[e.prop]?e.elem[e.prop]=e.now:de.style(e.elem,e.prop,e.now+e.unit)}}},I.propHooks.scrollTop=I.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},de.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},de.fx=I.prototype.init,de.fx.step={};var ht,dt,gt=/^(?:toggle|show|hide)$/,mt=/queueHooks$/;de.Animation=de.extend(U,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return d(n.elem,e,$e.exec(t),n),n}]},tweener:function(e,t){de.isFunction(e)?(t=e,e=["*"]):e=e.match(qe);for(var n,r=0,o=e.length;r1)},removeAttr:function(e){return this.each(function(){de.removeAttr(this,e)})}}),de.extend({attr:function(e,t,n){var r,o,i=e.nodeType;if(3!==i&&8!==i&&2!==i)return"undefined"==typeof e.getAttribute?de.prop(e,t,n):(1===i&&de.isXMLDoc(e)||(o=de.attrHooks[t.toLowerCase()]||(de.expr.match.bool.test(t)?vt:void 0)),void 0!==n?null===n?void de.removeAttr(e,t):o&&"set"in o&&void 0!==(r=o.set(e,n,t))?r:(e.setAttribute(t,n+""),n):o&&"get"in o&&null!==(r=o.get(e,t))?r:(r=de.find.attr(e,t),null==r?void 0:r))},attrHooks:{type:{set:function(e,t){if(!pe.radioValue&&"radio"===t&&de.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,o=t&&t.match(qe);if(o&&1===e.nodeType)for(;n=o[r++];)e.removeAttribute(n)}}),vt={set:function(e,t,n){return t===!1?de.removeAttr(e,n):e.setAttribute(n,n),n}},de.each(de.expr.match.bool.source.match(/\w+/g),function(e,t){var n=yt[t]||de.find.attr;yt[t]=function(e,t,r){var o,i,s=t.toLowerCase();return r||(i=yt[s],yt[s]=o,o=null!=n(e,t,r)?s:null,yt[s]=i),o}});var xt=/^(?:input|select|textarea|button)$/i,bt=/^(?:a|area)$/i;de.fn.extend({prop:function(e,t){return Le(this,de.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[de.propFix[e]||e]})}}),de.extend({prop:function(e,t,n){var r,o,i=e.nodeType;if(3!==i&&8!==i&&2!==i)return 1===i&&de.isXMLDoc(e)||(t=de.propFix[t]||t,o=de.propHooks[t]),void 0!==n?o&&"set"in o&&void 0!==(r=o.set(e,n,t))?r:e[t]=n:o&&"get"in o&&null!==(r=o.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=de.find.attr(e,"tabindex");return t?parseInt(t,10):xt.test(e.nodeName)||bt.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),pe.optSelected||(de.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),de.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){de.propFix[this.toLowerCase()]=this}),de.fn.extend({addClass:function(e){var t,n,r,o,i,s,a,u=0;if(de.isFunction(e))return this.each(function(t){de(this).addClass(e.call(this,t,X(this)))});if("string"==typeof e&&e)for(t=e.match(qe)||[];n=this[u++];)if(o=X(n),r=1===n.nodeType&&" "+z(o)+" "){for(s=0;i=t[s++];)r.indexOf(" "+i+" ")<0&&(r+=i+" ");a=z(r),o!==a&&n.setAttribute("class",a)}return this},removeClass:function(e){var t,n,r,o,i,s,a,u=0;if(de.isFunction(e))return this.each(function(t){de(this).removeClass(e.call(this,t,X(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof e&&e)for(t=e.match(qe)||[];n=this[u++];)if(o=X(n),r=1===n.nodeType&&" "+z(o)+" "){for(s=0;i=t[s++];)for(;r.indexOf(" "+i+" ")>-1;)r=r.replace(" "+i+" "," ");a=z(r),o!==a&&n.setAttribute("class",a)}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):de.isFunction(e)?this.each(function(n){de(this).toggleClass(e.call(this,n,X(this),t),t)}):this.each(function(){var t,r,o,i;if("string"===n)for(r=0,o=de(this),i=e.match(qe)||[];t=i[r++];)o.hasClass(t)?o.removeClass(t):o.addClass(t);else void 0!==e&&"boolean"!==n||(t=X(this),t&&Fe.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||e===!1?"":Fe.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;for(t=" "+e+" ";n=this[r++];)if(1===n.nodeType&&(" "+z(X(n))+" ").indexOf(t)>-1)return!0;return!1}});var wt=/\r/g;de.fn.extend({val:function(e){var t,n,r,o=this[0];{if(arguments.length)return r=de.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=r?e.call(this,n,de(this).val()):e,null==o?o="":"number"==typeof o?o+="":de.isArray(o)&&(o=de.map(o,function(e){return null==e?"":e+""})),t=de.valHooks[this.type]||de.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&void 0!==t.set(this,o,"value")||(this.value=o))});if(o)return t=de.valHooks[o.type]||de.valHooks[o.nodeName.toLowerCase()],t&&"get"in t&&void 0!==(n=t.get(o,"value"))?n:(n=o.value,"string"==typeof n?n.replace(wt,""):null==n?"":n)}}}),de.extend({valHooks:{option:{get:function(e){var t=de.find.attr(e,"value");return null!=t?t:z(de.text(e))}},select:{get:function(e){var t,n,r,o=e.options,i=e.selectedIndex,s="select-one"===e.type,a=s?null:[],u=s?i+1:o.length;for(r=i<0?u:s?i:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),i}}}}),de.each(["radio","checkbox"],function(){de.valHooks[this]={set:function(e,t){if(de.isArray(t))return e.checked=de.inArray(de(e).val(),t)>-1}},pe.checkOn||(de.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Tt=/^(?:focusinfocus|focusoutblur)$/;de.extend(de.event,{trigger:function(t,n,r,o){var i,s,a,u,c,l,f,p=[r||te],h=ce.call(t,"type")?t.type:t,d=ce.call(t,"namespace")?t.namespace.split("."):[];if(s=a=r=r||te,3!==r.nodeType&&8!==r.nodeType&&!Tt.test(h+de.event.triggered)&&(h.indexOf(".")>-1&&(d=h.split("."),h=d.shift(),d.sort()),c=h.indexOf(":")<0&&"on"+h,t=t[de.expando]?t:new de.Event(h,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=d.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:de.makeArray(n,[t]),f=de.event.special[h]||{},o||!f.trigger||f.trigger.apply(r,n)!==!1)){if(!o&&!f.noBubble&&!de.isWindow(r)){for(u=f.delegateType||h,Tt.test(u+h)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(r.ownerDocument||te)&&p.push(a.defaultView||a.parentWindow||e)}for(i=0;(s=p[i++])&&!t.isPropagationStopped();)t.type=i>1?u:f.bindType||h,l=(Fe.get(s,"events")||{})[t.type]&&Fe.get(s,"handle"),l&&l.apply(s,n),l=c&&s[c],l&&l.apply&&He(s)&&(t.result=l.apply(s,n),t.result===!1&&t.preventDefault());return t.type=h,o||t.isDefaultPrevented()||f._default&&f._default.apply(p.pop(),n)!==!1||!He(r)||c&&de.isFunction(r[h])&&!de.isWindow(r)&&(a=r[c],a&&(r[c]=null),de.event.triggered=h,r[h](),de.event.triggered=void 0,a&&(r[c]=a)),t.result}},simulate:function(e,t,n){var r=de.extend(new de.Event,n,{type:e,isSimulated:!0});de.event.trigger(r,null,t)}}),de.fn.extend({trigger:function(e,t){return this.each(function(){de.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return de.event.trigger(e,t,n,!0)}}),de.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,t){de.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),de.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),pe.focusin="onfocusin"in e,pe.focusin||de.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){de.event.simulate(t,e.target,de.event.fix(e))};de.event.special[t]={setup:function(){var r=this.ownerDocument||this,o=Fe.access(r,t);o||r.addEventListener(e,n,!0),Fe.access(r,t,(o||0)+1)},teardown:function(){var r=this.ownerDocument||this,o=Fe.access(r,t)-1;o?Fe.access(r,t,o):(r.removeEventListener(e,n,!0),Fe.remove(r,t))}}});var Ct=e.location,jt=de.now(),kt=/\?/;de.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(e){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||de.error("Invalid XML: "+t),n};var Et=/\[\]$/,St=/\r?\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;de.param=function(e,t){var n,r=[],o=function(e,t){var n=de.isFunction(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(de.isArray(e)||e.jquery&&!de.isPlainObject(e))de.each(e,function(){o(this.name,this.value)});else for(n in e)V(n,e[n],t,o);return r.join("&")},de.fn.extend({serialize:function(){return de.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=de.prop(this,"elements");return e?de.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!de(this).is(":disabled")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!ze.test(e))}).map(function(e,t){var n=de(this).val();return null==n?null:de.isArray(n)?de.map(n,function(e){return{name:t.name,value:e.replace(St,"\r\n")}}):{name:t.name,value:n.replace(St,"\r\n")}}).get()}});var qt=/%20/g,Dt=/#.*$/,Ot=/([?&])_=[^&]*/,Lt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Ht=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ft=/^(?:GET|HEAD)$/,Rt=/^\/\//,It={},Pt={},Mt="*/".concat("*"),$t=te.createElement("a");$t.href=Ct.href,de.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:"GET",isLocal:Ht.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Mt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":de.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Q(Q(e,de.ajaxSettings),t):Q(de.ajaxSettings,e)},ajaxPrefilter:G(It),ajaxTransport:G(Pt),ajax:function(t,n){function r(t,n,r,a){var c,p,h,b,w,T=n;l||(l=!0,u&&e.clearTimeout(u),o=void 0,s=a||"",C.readyState=t>0?4:0,c=t>=200&&t<300||304===t,r&&(b=J(d,C,r)),b=K(d,b,C,c),c?(d.ifModified&&(w=C.getResponseHeader("Last-Modified"),w&&(de.lastModified[i]=w),w=C.getResponseHeader("etag"),w&&(de.etag[i]=w)),204===t||"HEAD"===d.type?T="nocontent":304===t?T="notmodified":(T=b.state,p=b.data,h=b.error,c=!h)):(h=T,!t&&T||(T="error",t<0&&(t=0))),C.status=t,C.statusText=(n||T)+"",c?v.resolveWith(g,[p,T,C]):v.rejectWith(g,[C,T,h]),C.statusCode(x),x=void 0,f&&m.trigger(c?"ajaxSuccess":"ajaxError",[C,d,c?p:h]),y.fireWith(g,[C,T]),f&&(m.trigger("ajaxComplete",[C,d]),--de.active||de.event.trigger("ajaxStop")))}"object"==typeof t&&(n=t,t=void 0),n=n||{};var o,i,s,a,u,c,l,f,p,h,d=de.ajaxSetup({},n),g=d.context||d,m=d.context&&(g.nodeType||g.jquery)?de(g):de.event,v=de.Deferred(),y=de.Callbacks("once memory"),x=d.statusCode||{},b={},w={},T="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(l){if(!a)for(a={};t=Lt.exec(s);)a[t[1].toLowerCase()]=t[2];t=a[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return l?s:null},setRequestHeader:function(e,t){return null==l&&(e=w[e.toLowerCase()]=w[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==l&&(d.mimeType=e),this},statusCode:function(e){var t;if(e)if(l)C.always(e[C.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||T;return o&&o.abort(t),r(0,t),this}};if(v.promise(C),d.url=((t||d.url||Ct.href)+"").replace(Rt,Ct.protocol+"//"),d.type=n.method||n.type||d.method||d.type,d.dataTypes=(d.dataType||"*").toLowerCase().match(qe)||[""],null==d.crossDomain){c=te.createElement("a");try{c.href=d.url,c.href=c.href,d.crossDomain=$t.protocol+"//"+$t.host!=c.protocol+"//"+c.host}catch(e){d.crossDomain=!0}}if(d.data&&d.processData&&"string"!=typeof d.data&&(d.data=de.param(d.data,d.traditional)),Y(It,d,n,C),l)return C;f=de.event&&d.global,f&&0===de.active++&&de.event.trigger("ajaxStart"),d.type=d.type.toUpperCase(),d.hasContent=!Ft.test(d.type),i=d.url.replace(Dt,""),d.hasContent?d.data&&d.processData&&0===(d.contentType||"").indexOf("application/x-www-form-urlencoded")&&(d.data=d.data.replace(qt,"+")):(h=d.url.slice(i.length),d.data&&(i+=(kt.test(i)?"&":"?")+d.data,delete d.data),d.cache===!1&&(i=i.replace(Ot,"$1"),h=(kt.test(i)?"&":"?")+"_="+jt++ +h),d.url=i+h),d.ifModified&&(de.lastModified[i]&&C.setRequestHeader("If-Modified-Since",de.lastModified[i]),de.etag[i]&&C.setRequestHeader("If-None-Match",de.etag[i])),(d.data&&d.hasContent&&d.contentType!==!1||n.contentType)&&C.setRequestHeader("Content-Type",d.contentType),C.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+("*"!==d.dataTypes[0]?", "+Mt+"; q=0.01":""):d.accepts["*"]);for(p in d.headers)C.setRequestHeader(p,d.headers[p]);if(d.beforeSend&&(d.beforeSend.call(g,C,d)===!1||l))return C.abort();if(T="abort",y.add(d.complete),C.done(d.success),C.fail(d.error),o=Y(Pt,d,n,C)){if(C.readyState=1,f&&m.trigger("ajaxSend",[C,d]),l)return C;d.async&&d.timeout>0&&(u=e.setTimeout(function(){C.abort("timeout")},d.timeout));try{l=!1,o.send(b,r)}catch(e){if(l)throw e;r(-1,e)}}else r(-1,"No Transport");return C},getJSON:function(e,t,n){return de.get(e,t,n,"json")},getScript:function(e,t){return de.get(e,void 0,t,"script")}}),de.each(["get","post"],function(e,t){de[t]=function(e,n,r,o){return de.isFunction(n)&&(o=o||r,r=n,n=void 0),de.ajax(de.extend({url:e,type:t,dataType:o,data:n,success:r},de.isPlainObject(e)&&e))}}),de._evalUrl=function(e){return de.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,throws:!0})},de.fn.extend({wrapAll:function(e){var t;return this[0]&&(de.isFunction(e)&&(e=e.call(this[0])),t=de(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return de.isFunction(e)?this.each(function(t){de(this).wrapInner(e.call(this,t))}):this.each(function(){var t=de(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=de.isFunction(e);return this.each(function(n){de(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){de(this).replaceWith(this.childNodes)}),this}}),de.expr.pseudos.hidden=function(e){return!de.expr.pseudos.visible(e)},de.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},de.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Wt={0:200,1223:204},Bt=de.ajaxSettings.xhr();pe.cors=!!Bt&&"withCredentials"in Bt,pe.ajax=Bt=!!Bt,de.ajaxTransport(function(t){var n,r;if(pe.cors||Bt&&!t.crossDomain)return{send:function(o,i){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest");for(s in o)a.setRequestHeader(s,o[s]);n=function(e){return function(){n&&(n=r=a.onload=a.onerror=a.onabort=a.onreadystatechange=null,"abort"===e?a.abort():"error"===e?"number"!=typeof a.status?i(0,"error"):i(a.status,a.statusText):i(Wt[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=n(),r=a.onerror=n("error"),void 0!==a.onabort?a.onabort=r:a.onreadystatechange=function(){4===a.readyState&&e.setTimeout(function(){n&&r()})},n=n("abort");try{a.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),de.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),de.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return de.globalEval(e),e}}}),de.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),de.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(r,o){t=de(" + + + + +
    +
    + + + + + + + + +
    + +
    + +
    + + + + + + + + +
    +
    + +
    +
    + +
    + +

    介绍

    +

    本项目致力于对 Python 3.7 的源码分析,深度参考陈儒大大的《Python 源码剖析》,编写 Python 3 的版本。

    +

    希望各位 Python 爱好者能参与其中,一起探索 Python 魔法背后的奥秘!

    +

    使用

    +

    您可以直接访问 在线版,或者根据以下步骤访问本地版。

    +

    前置条件

    +

    您的系统上需要安装好 node (会自带npm)。

    +

    使用 make 或者使用 npm 命令去构建

    +

    使用 make 命令的方式构建:

    +

    若您可使用 make 命令,简单执行如下命令进行初始化:

    +
    make init
    +
    +

    执行如下命令运行服务端:

    +
    make run
    +
    +

    使用 npm 命令的方式构建:

    +

    若您不能使用 make 命令,或想直接使用 npm 命令,执行如下命令进行初始化:

    +

    安装项目依赖:

    +
    npm install
    +
    +

    执行如下命令运行服务端:

    +
    npm run serve
    +
    +

    访问

    +

    直接访问 http://localhost:4000 即可查看本书内容。

    +

    Roadmap

    +

    大体按照《Python 源码剖析》中的目录结构进行编写。依次介绍 Python 源码基本信息、内建对象和虚拟机。

    +
      +
    • [x] 章节
        +
      • [x] 序章
      • +
      • [x] 前言
      • +
      • [x] Python 源代码的组织
      • +
      • [x] Windows 环境下编译 Python
      • +
      • [x] UNIX/Linux 环境下编译 Python
      • +
      • [x] 修改 Python 源码
      • +
      +
    • +
    • [ ] Python 内建对象
        +
      • [x] Python 对象初探
      • +
      • [x] Python 整数对象
      • +
      • [ ] Python 字符串 对象
      • +
      • [x] Python List 对象
      • +
      • [x] Python Dict 对象
      • +
      • [x] Python Set 对象
      • +
      • [ ] 实现简版 Python
      • +
      +
    • +
    • [ ] Python 虚拟机
        +
      • [ ] Python 编译结果
      • +
      • [ ] Python 虚拟机框架
      • +
      • [ ] 虚拟机一般表达式
      • +
      • [ ] Python 虚拟机控制流
      • +
      • [ ] Python 虚拟机函数机制
      • +
      • [ ] Python 运行环境初始化
      • +
      • [ ] Python 模块加载机制
      • +
      • [ ] Python 多线程机制
      • +
      • [ ] Python 内存管理机制
      • +
      +
    • +
    +
    Copyright © FlagGo 2019 all right reserved,powered by Gitbook该文件修订时间: +2020-03-23 19:36:27 +
    + +
    + +
    +
    +
    + +

    results matching ""

    +
      + +
      +
      + +

      No results matching ""

      + +
      +
      +
      + +
      +
      + +
      + + + + + + + + + + +
      + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/objects/dict-object/index.html b/objects/dict-object/index.html new file mode 100644 index 0000000..6fdb726 --- /dev/null +++ b/objects/dict-object/index.html @@ -0,0 +1,1104 @@ + + + + + + + Python Dict 对象 · Python 3 源码分析 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      +
      + + + + + + + + +
      + +
      + +
      + + + + + + + + +
      +
      + +
      +
      + +
      + +

      Python 字典

      +

      Dictionary object implementation using a hash table ,通过描述可知,python 的字典就是实现了一个 hash 表。

      +

      Python 字典概述

      +

      在 python 的字典中,一个键值对的对应保存就是 PyDictEntry 类型来保存;

      +

      源文件:Include/dict-common.h

      +
      // Objects/dict-common.h
      +typedef struct {
      +    /* Cached hash code of me_key. */
      +    Py_hash_t me_hash;
      +    PyObject *me_key;
      +    PyObject *me_value; /* This field is only meaningful for combined tables */
      +} PyDictKeyEntry;
      +
      +

      其中,me_hash 就是哈希生成的值,me_key 就是对应的 key 值,me_value 就是对应的值。 +在 python 中,在一个 PyDictObject 对象的变化过程中,entry 的状态会在不同的状态间转换。基本上在如下四种状态中转换:Unused、Active、Dummy 和 Pending。

      +
        +
      1. Unused:没有插入任何一个获取的 key 与 value,并且在此之前也没有存储任何的 key,value,每一个 entry 在初始化的时候都会处于这种状态,并且 Unused 会被里面切换到 Active 态,当有 key 插入,这就是 entry 初始化的状态。
      2. +
      3. Active:当 index>=0 时,me_key 不为空并且 me_value 不为空,保存了一个键值对,Active 可以转变为 Dummy 或者 Pending 状态,当一个键被删除的时候,这只会在 me_value 不为空的时候出现。
      4. +
      5. Dummy:先前保存了一个 Active 的键值对,但是这个键值对被删除了并且一个活跃的键值对还没有填入该位置,Dummy 可以转变为 Active 当删除的时候,Dummy 的位置不能被重新使用,一旦发生碰撞,探针序列就无法知道这对键值对曾是活跃的键值对。
      6. +
      7. Pending:索引>=0,键!=空,值=空(仅拆分),尚未插入到拆分表中。
      8. +
      +

      字典的两种类型

      +

      python 的字典类型中包含了两种,分离字典(split-table dictionaries)与联合字典(combined-table dictonaries)。详细的信息可查看有关 dict 的描述pep-0412

      +

      split-table dictionaries

      +

      当被创建的字典是用来保存 object 的__dict__属性时,该字典才会创建为一个 split-table,它们的键表都被缓存在类型属性中,并且允许所有该类型的实例都可以共享该 keys。当出现一个事件将字典的属性值进行改变的时候,个别字典将慢慢的转化成组合表的形式。这就保证了在大部分的应用场景下很高的内存利用效率,并保证了在各个场景下的正确性。当 split-dict 重新改变大小,它会立马改变为一个 combined-table,如果重置大小作为保存实例属性的结果,并且只有一个该 object 的实例,字典会立马再变为一个 split-table。如果从 split-table 中删除一个 key, value,它不会删除 keys tables 中对应的该值,而只是将 values 数值中移除了该 value。

      +

      combined-table dictionaries

      +

      直接通过 dict 內建函数与{}生成的字典,模块和大部分其他字典都会创建为 combined-table 字典,一个 combined-table 不会改变为一个 split-table 字典,该字典的行为方式与最初的字典的行为方式大致相同。

      +

      容器的相关数据结构

      +

      字典对象是通过 PyDictObject 来实现数据的,详情如下;

      +

      源文件:Include/dictobject.h

      +
      // Include/dictobject.h
      +typedef struct _dictkeysobject PyDictKeysObject;
      +
      +/* The ma_values pointer is NULL for a combined table
      + * or points to an array of PyObject* for a split table
      + */
      +typedef struct {
      +    PyObject_HEAD
      +
      +    /* Number of items in the dictionary */
      +    Py_ssize_t ma_used;                 // 使用的keys个数
      +
      +    /* Dictionary version: globally unique, value change each time
      +       the dictionary is modified */
      +    uint64_t ma_version_tag;
      +
      +    PyDictKeysObject *ma_keys;     // 如果有则是保存的keys数据
      +
      +    /* If ma_values is NULL, the table is "combined": keys and values
      +       are stored in ma_keys.
      +
      +       If ma_values is not NULL, the table is splitted:
      +       keys are stored in ma_keys and values are stored in ma_values */
      +    PyObject **ma_values;              // 如果不为空则保存的是values
      +} PyDictObject;
      +
      +

      其中,PyDictKeysObject 的定义如下;

      +

      源文件:Include/dict-common.h

      +
      // Objects/dict-common.h
      +/* See dictobject.c for actual layout of DictKeysObject */
      +struct _dictkeysobject {
      +    Py_ssize_t dk_refcnt;                  // 引用计数
      +
      +    /* Size of the hash table (dk_indices). It must be a power of 2. */
      +    Py_ssize_t dk_size;                   // hash table 的大小必须是2的倍数
      +
      +    /* Function to lookup in the hash table (dk_indices):
      +
      +       - lookdict(): general-purpose, and may return DKIX_ERROR if (and
      +         only if) a comparison raises an exception.
      +
      +       - lookdict_unicode(): specialized to Unicode string keys, comparison of
      +         which can never raise an exception; that function can never return
      +         DKIX_ERROR.
      +
      +       - lookdict_unicode_nodummy(): similar to lookdict_unicode() but further
      +         specialized for Unicode string keys that cannot be the <dummy> value.
      +
      +       - lookdict_split(): Version of lookdict() for split tables. */
      +    dict_lookup_func dk_lookup;                       // 哈希查找函数
      +
      +    /* Number of usable entries in dk_entries. */
      +    Py_ssize_t dk_usable;                             // 可用的entry数量
      +
      +    /* Number of used entries in dk_entries. */ 
      +    Py_ssize_t dk_nentries;                     // 已经使用的entry数量
      +
      +    /* Actual hash table of dk_size entries. It holds indices in dk_entries,
      +       or DKIX_EMPTY(-1) or DKIX_DUMMY(-2).
      +
      +       Indices must be: 0 <= indice < USABLE_FRACTION(dk_size).
      +
      +       The size in bytes of an indice depends on dk_size:
      +
      +       - 1 byte if dk_size <= 0xff (char*)
      +       - 2 bytes if dk_size <= 0xffff (int16_t*)
      +       - 4 bytes if dk_size <= 0xffffffff (int32_t*)
      +       - 8 bytes otherwise (int64_t*)
      +
      +       Dynamically sized, SIZEOF_VOID_P is minimum. */
      +    char dk_indices[];  /* char is required to avoid strict aliasing. */   // 存入的entries
      +
      +    /* "PyDictKeyEntry dk_entries[dk_usable];" array follows:
      +       see the DK_ENTRIES() macro */
      +};
      +
      +

      相关数据结构的内存布局为; +python_dict_mem

      +

      Python 字典示例

      +

      本次示例脚本如下:

      +
      d = {}
      +d['1']='2'
      +d['1']='e'
      +d.pop('1')
      +
      +

      通过 Python 的反汇编工具获取字节码;

      +
      python -m dis dict_test.py
      +
      +

      输出的字节码如下;

      +
        2           0 BUILD_MAP                0
      +              2 STORE_NAME               0 (d)
      +
      +  3           4 LOAD_CONST               0 ('2')
      +              6 LOAD_NAME                0 (d)
      +              8 LOAD_CONST               1 ('1')
      +             10 STORE_SUBSCR
      +
      +  4          12 LOAD_CONST               2 ('e')
      +             14 LOAD_NAME                0 (d)
      +             16 LOAD_CONST               1 ('1')
      +             18 STORE_SUBSCR
      +
      +  5          20 LOAD_NAME                0 (d)
      +             22 LOAD_METHOD              1 (pop)
      +             24 LOAD_CONST               1 ('1')
      +             26 CALL_METHOD              1
      +             28 POP_TOP
      +             30 LOAD_CONST               3 (None)
      +             32 RETURN_VALUE
      +
      +

      通过字节码指令可知,首先调用了 BUILD_MAP 来创建一个新的字典,接着就对新建的字典 d 进行了赋值操作与更新操作,最后调用了 pop 方法删除一个 key。接下来就详细分析一下相关流程。

      +

      字典的初始化流程

      +

      通过查找 BUILD_MAP 的虚拟机执行函数;

      +

      源文件:Python/ceval.c

      +
      // Python/ceval.c
      +switch (opcode) {
      +    ...
      +
      +    TARGET(BUILD_MAP) {
      +        Py_ssize_t i;
      +        PyObject *map = _PyDict_NewPresized((Py_ssize_t)oparg);    // 新建并初始化一个字典
      +        if (map == NULL)
      +            goto error;                                           // 如果新建失败则报错
      +        for (i = oparg; i > 0; i--) {                            // 检查在新建的过程中是否通过参数传值
      +            int err;
      +            PyObject *key = PEEK(2*i);
      +            PyObject *value = PEEK(2*i - 1);
      +            err = PyDict_SetItem(map, key, value);             // 找到对应的值并讲该值设置到map中
      +            if (err != 0) {                        // 检查是否报错
      +                Py_DECREF(map);
      +                goto error;                        // 如果错误就报错处理
      +            }
      +        }
      +
      +        while (oparg--) {
      +            Py_DECREF(POP());                       // 弹出栈上输入参数的引用
      +            Py_DECREF(POP());
      +        }
      +        PUSH(map);                              // 讲生成的map压栈
      +        DISPATCH();                             // 检查是否需要执行下一条字节码指令
      +    }
      +}
      +
      +

      从该函数的执行可知,初始化的函数是从_PyDict_NewPresized 开始,该函数就是生成并初始化一个字典;

      +

      源文件:Objects/dictobject.c

      +
      // Objects/dictobject.c
      +
      +PyObject *
      +_PyDict_NewPresized(Py_ssize_t minused)
      +{
      +    const Py_ssize_t max_presize = 128 * 1024;          // 字典最大的容量
      +    Py_ssize_t newsize;
      +    PyDictKeysObject *new_keys;
      +
      +    /* There are no strict guarantee that returned dict can contain minused
      +     * items without resize.  So we create medium size dict instead of very
      +     * large dict or MemoryError.
      +     */
      +    if (minused > USABLE_FRACTION(max_presize)) {       // 检查传入的数量是否超过最大值
      +        newsize = max_presize;
      +    }
      +    else {
      +        Py_ssize_t minsize = ESTIMATE_SIZE(minused);    // 获取最小的值,在新建一个空的字典的时候该值为0
      +        newsize = PyDict_MINSIZE;                       // 设置字典的最小值 为8
      +        while (newsize < minsize) {                     // 如果传入的值大于最小值则调整newsize 大小
      +            newsize <<= 1;
      +        }
      +    }
      +    assert(IS_POWER_OF_2(newsize));
      +
      +    new_keys = new_keys_object(newsize);                // 生成并初始化一个PyDictKeysObject对象
      +    if (new_keys == NULL)
      +        return NULL;
      +    return new_dict(new_keys, NULL);                    // 生成一个新的对象并返回
      +}
      +
      +

      首先,先计算出需要生成的字典的大小,然后再初始化一个 PyDictKeysObject,最后就生成一个 PyDictObject 返回。继续查看 new_keys_object 的执行流程;

      +

      源文件:Objects/dictobject.c

      +
      // Objects/dictobject.c
      +
      +static PyDictKeysObject *new_keys_object(Py_ssize_t size)
      +{
      +    PyDictKeysObject *dk;
      +    Py_ssize_t es, usable;
      +
      +    assert(size >= PyDict_MINSIZE);           // 检查size是否大于最小size
      +    assert(IS_POWER_OF_2(size));              // 检查是否是2的倍数
      +
      +    usable = USABLE_FRACTION(size);           // 检查是否可用  根据经验在1/2和2/3之间效果最好
      +    if (size <= 0xff) {
      +        es = 1;
      +    }
      +    else if (size <= 0xffff) {
      +        es = 2;
      +    }
      +#if SIZEOF_VOID_P > 4
      +    else if (size <= 0xffffffff) {
      +        es = 4;
      +    }
      +#endif
      +    else {
      +        es = sizeof(Py_ssize_t);
      +    }
      +
      +    if (size == PyDict_MINSIZE && numfreekeys > 0) {      // 是否有缓存,如果有缓存就选择缓存中的dk
      +        dk = keys_free_list[--numfreekeys];
      +    }
      +    else {
      +        dk = PyObject_MALLOC(sizeof(PyDictKeysObject)
      +                             + es * size
      +                             + sizeof(PyDictKeyEntry) * usable);    // 没有缓存可使用的字典则申请内存生成一个
      +        if (dk == NULL) {
      +            PyErr_NoMemory();
      +            return NULL;
      +        }
      +    }
      +    DK_DEBUG_INCREF dk->dk_refcnt = 1;                              // 设置引用计数
      +    dk->dk_size = size;                                             // 设置大小
      +    dk->dk_usable = usable;                                        // 设置是否可用
      +    dk->dk_lookup = lookdict_unicode_nodummy;                       // 设置查找函数
      +    dk->dk_nentries = 0;
      +    memset(&dk->dk_indices[0], 0xff, es * size);                    // 将申请的内存置空
      +    memset(DK_ENTRIES(dk), 0, sizeof(PyDictKeyEntry) * usable);
      +    return dk;
      +}
      +
      +

      主要就是通过传入的 size,检查是否超过设置的大小,检查是否有缓存的字典数据可用,如果没有则申请内存重新生成一个 dk,最后进行申请到的内存讲内容清空。接着就会进行 new_dict 初始化数据;

      +

      源文件:Objects/dictobject.c

      +
      // Objects/dictobject.c
      +
      +/* Consumes a reference to the keys object */
      +static PyObject *
      +new_dict(PyDictKeysObject *keys, PyObject **values)
      +{
      +    PyDictObject *mp;
      +    assert(keys != NULL);
      +    if (numfree) {                            // 判断缓冲池是否有
      +        mp = free_list[--numfree];
      +        assert (mp != NULL);
      +        assert (Py_TYPE(mp) == &PyDict_Type); 
      +        _Py_NewReference((PyObject *)mp);              // 使用缓冲池对象    
      +    }
      +    else {
      +        mp = PyObject_GC_New(PyDictObject, &PyDict_Type);    // 缓冲池没有则申请新的对象并初始化
      +        if (mp == NULL) {
      +            DK_DECREF(keys);
      +            free_values(values);
      +            return NULL;
      +        }
      +    }
      +    mp->ma_keys = keys;
      +    mp->ma_values = values;
      +    mp->ma_used = 0;                           // 设置ma_used为0
      +    mp->ma_version_tag = DICT_NEXT_VERSION();
      +    assert(_PyDict_CheckConsistency(mp));
      +    return (PyObject *)mp;
      +}
      +
      +

      new_dict 就是根据 keys,values 设置到从缓冲池或者新生成一个 dict 对象,最后返回。至此,dict 的创建工作已经完成。

      +

      字典的插入与查找

      +

      通过字节码的指令 STORE_SUBSCR 可知,该命令就是讲'1'作为 key, '2'作为 value 插入到 d 中,此时查看该执行函数;

      +

      源文件:Python/ceval.c

      +
      // Python/ceval.c
      +switch (opcode) {
      +    ...
      +
      +    TARGET(STORE_SUBSCR) {
      +        PyObject *sub = TOP();                 // 第一个值为key
      +        PyObject *container = SECOND();        // 该为字典对象
      +        PyObject *v = THIRD();                 // 该为value
      +        int err;
      +        STACKADJ(-3);
      +        /* container[sub] = v */
      +        err = PyObject_SetItem(container, sub, v);  // 调用该方法设置值
      +        Py_DECREF(v);
      +        Py_DECREF(container);
      +        Py_DECREF(sub);
      +        if (err != 0)
      +            goto error;
      +        DISPATCH();
      +    }
      +}
      +
      +

      此时,从栈中取出相关参数,并将这些值传入 PyObject_SetItem 函数进行处理设置值;

      +

      源文件:Objects/abstract.c

      +
      // Objects/abstract.c
      +int
      +PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
      +{
      +    PyMappingMethods *m;
      +
      +    if (o == NULL || key == NULL || value == NULL) {           // 检查是否为空如果任一为空则报错
      +        null_error();
      +        return -1;
      +    }
      +    m = o->ob_type->tp_as_mapping;                      // 获取类型的tp_as_mapping方法集     
      +    if (m && m->mp_ass_subscript)                       // 如果有设置该类型
      +        return m->mp_ass_subscript(o, key, value);                    // 调用该mp_ass_subscript方法
      +
      +    if (o->ob_type->tp_as_sequence) {                                 // 获取作为队列的操作集
      +        if (PyIndex_Check(key)) {                       // 检查key是否是索引
      +            Py_ssize_t key_value;
      +            key_value = PyNumber_AsSsize_t(key, PyExc_IndexError); 
      +            if (key_value == -1 && PyErr_Occurred())
      +                return -1;
      +            return PySequence_SetItem(o, key_value, value);       // 调用索引插入
      +        }
      +        else if (o->ob_type->tp_as_sequence->sq_ass_item) {
      +            type_error("sequence index must be "
      +                       "integer, not '%.200s'", key);
      +            return -1;
      +        }
      +    }
      +
      +    type_error("'%.200s' object does not support item assignment", o);   // 则该类型对象不支持设置
      +    return -1;
      +}
      +
      +

      其中就调用了字典的 tp_as_mapping 的方法集,并调用了该方法集的 mp_ass_subscript 方法;此时我们分析一下,dict 的 tp_as_mapping 的方法集。此时就调用了 tp_as_mapping 的 mp_ass_subscript 方法,此时就是调用 dict 的 dict_ass_sub 方法;

      +

      源文件:Objects/dictobject.c

      +
      // Objects/dictobject.c
      +static int
      +dict_ass_sub(PyDictObject *mp, PyObject *v, PyObject *w)
      +{
      +    if (w == NULL)
      +        return PyDict_DelItem((PyObject *)mp, v);
      +    else
      +        return PyDict_SetItem((PyObject *)mp, v, w);
      +}
      +
      +

      可知,删除一个 key 就是 PyDict_DelItem,设置一个 key 就是 PyDict_SetItem;

      +

      源文件:Objects/dictobject.c

      +
      // Objects/dictobject.c
      +int
      +PyDict_SetItem(PyObject *op, PyObject *key, PyObject *value)
      +{
      +    PyDictObject *mp;
      +    Py_hash_t hash;
      +    if (!PyDict_Check(op)) {            // 检查是否是字典类型
      +        PyErr_BadInternalCall();
      +        return -1;
      +    }
      +    assert(key);
      +    assert(value);
      +    mp = (PyDictObject *)op;
      +    if (!PyUnicode_CheckExact(key) ||
      +        (hash = ((PyASCIIObject *) key)->hash) == -1)  // 检查传入的key是否hash为-1
      +    {
      +        hash = PyObject_Hash(key);                      // 生成hash调用key对应的tp_hash方法,在本例中传入的是str类型,则调用str类型的tp_hash方法
      +        if (hash == -1)
      +            return -1;
      +    }
      +
      +    /* insertdict() handles any resizing that might be necessary */
      +    return insertdict(mp, key, hash, value);          // 生成hash调用key对应的tp_hash方法
      +}
      +
      +

      insertdict 方法就是将生成的方法,插入到字典中去;

      +

      源文件:Objects/dictobject.c

      +
      // Objects/dictobject.c
      +static int
      +insertdict(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject *value)
      +{
      +    PyObject *old_value;
      +    PyDictKeyEntry *ep;
      +
      +    Py_INCREF(key);
      +    Py_INCREF(value);
      +    if (mp->ma_values != NULL && !PyUnicode_CheckExact(key)) {
      +        if (insertion_resize(mp) < 0)                     // 重新设置mp的大小  如果ma_values有值
      +            goto Fail;
      +    }
      +
      +    Py_ssize_t ix = mp->ma_keys->dk_lookup(mp, key, hash, &old_value);     // 调用查找方法
      +    if (ix == DKIX_ERROR)
      +        goto Fail;
      +
      +    assert(PyUnicode_CheckExact(key) || mp->ma_keys->dk_lookup == lookdict);
      +    MAINTAIN_TRACKING(mp, key, value);                                        // 检查mp key values是否需要加入垃圾回收
      +
      +    /* When insertion order is different from shared key, we can't share
      +     * the key anymore.  Convert this instance to combine table.
      +     */
      +    if (_PyDict_HasSplitTable(mp) &&
      +        ((ix >= 0 && old_value == NULL && mp->ma_used != ix) ||
      +         (ix == DKIX_EMPTY && mp->ma_used != mp->ma_keys->dk_nentries))) {  // 检查是否是分离表,如果没查找到旧值并且
      +        if (insertion_resize(mp) < 0)                         // 重新设置该字典大小
      +            goto Fail;
      +        ix = DKIX_EMPTY;
      +    }
      +
      +    if (ix == DKIX_EMPTY) {
      +        /* Insert into new slot. */
      +        assert(old_value == NULL);
      +        if (mp->ma_keys->dk_usable <= 0) {                      // 如果可用的值小于0
      +            /* Need to resize. */
      +            if (insertion_resize(mp) < 0)                       // 需要重新扩展字典大小
      +                goto Fail;
      +        }
      +        Py_ssize_t hashpos = find_empty_slot(mp->ma_keys, hash);         // 查找一个可用的hash位置
      +        ep = &DK_ENTRIES(mp->ma_keys)[mp->ma_keys->dk_nentries];         // 获取存取的地址
      +        dk_set_index(mp->ma_keys, hashpos, mp->ma_keys->dk_nentries);      // 设置该值
      +        ep->me_key = key;                                 // 保存key
      +        ep->me_hash = hash;                                                   // 保存计算得出的hash值
      +        if (mp->ma_values) {                               // 如果mp的ma_values有值
      +            assert (mp->ma_values[mp->ma_keys->dk_nentries] == NULL);
      +            mp->ma_values[mp->ma_keys->dk_nentries] = value;           // 设置该key对应的value
      +        }
      +        else {
      +            ep->me_value = value;                                             // 直接讲value设置到entry上面
      +        }
      +        mp->ma_used++;                                   // 使用个数加1
      +        mp->ma_version_tag = DICT_NEXT_VERSION();  
      +        mp->ma_keys->dk_usable--;                            // 可用减1
      +        mp->ma_keys->dk_nentries++;
      +        assert(mp->ma_keys->dk_usable >= 0);
      +        assert(_PyDict_CheckConsistency(mp));
      +        return 0;
      +    }
      +
      +    if (_PyDict_HasSplitTable(mp)) {                                         // 如果是分离的
      +        mp->ma_values[ix] = value;                                           // 直接设置ma_values对应的ix到values中
      +        if (old_value == NULL) {
      +            /* pending state */
      +            assert(ix == mp->ma_used);
      +            mp->ma_used++;                               // 使用加1
      +        }
      +    }
      +    else {
      +        assert(old_value != NULL);
      +        DK_ENTRIES(mp->ma_keys)[ix].me_value = value;
      +    }
      +
      +    mp->ma_version_tag = DICT_NEXT_VERSION();
      +    Py_XDECREF(old_value); /* which **CAN** re-enter (see issue #22653) */
      +    assert(_PyDict_CheckConsistency(mp));
      +    Py_DECREF(key);
      +    return 0;
      +
      +Fail:
      +    Py_DECREF(value);
      +    Py_DECREF(key);
      +    return -1;
      +}
      +
      +

      首先会调用相关的查找方法,去查找待搜索的值是否已经存在字典中,如果当前字典数据已经满了则会按照增长大小的函数生成一个新的字典,并把旧数据设置到新的字典中,当找到的字典匹配时则返回。

      +

      其中 dk_lookup 对应的方法,在初始化之后对应的是 lookdict_unicode_nodummy;

      +

      源文件:Objects/dictobject.c

      +
      // Objects/dictobject.c
      +
      +/* Faster version of lookdict_unicode when it is known that no <dummy> keys
      + * will be present. */
      +static Py_ssize_t _Py_HOT_FUNCTION
      +lookdict_unicode_nodummy(PyDictObject *mp, PyObject *key,
      +                         Py_hash_t hash, PyObject **value_addr)
      +{
      +    assert(mp->ma_values == NULL);
      +    /* Make sure this function doesn't have to handle non-unicode keys,
      +       including subclasses of str; e.g., one reason to subclass
      +       unicodes is to override __eq__, and for speed we don't cater to
      +       that here. */
      +    if (!PyUnicode_CheckExact(key)) {                     // 检查如果不是unicode则直接调用lookdict方法查找
      +        mp->ma_keys->dk_lookup = lookdict;
      +        return lookdict(mp, key, hash, value_addr);
      +    }
      +
      +    PyDictKeyEntry *ep0 = DK_ENTRIES(mp->ma_keys);             // 获取keys的首个元素地址
      +    size_t mask = DK_MASK(mp->ma_keys);                    // 获取大小
      +    size_t perturb = (size_t)hash;
      +    size_t i = (size_t)hash & mask;                       // 获取生成的最终的值                 
      +
      +    for (;;) {
      +        Py_ssize_t ix = dk_get_index(mp->ma_keys, i);                // 便利ma_keys key列表
      +        assert (ix != DKIX_DUMMY);                     // 判断不能为空
      +        if (ix == DKIX_EMPTY) {                                     // 如果为空则证明找到一个可以使用的
      +            *value_addr = NULL;                       // 讲key对应的value设置为空
      +            return DKIX_EMPTY;                        // 返回
      +        }
      +        PyDictKeyEntry *ep = &ep0[ix];                       // 获取该位置元素值
      +        assert(ep->me_key != NULL);
      +        assert(PyUnicode_CheckExact(ep->me_key));
      +        if (ep->me_key == key ||
      +            (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {  // 如果key相同 hash值也相同
      +            *value_addr = ep->me_value;                    // 将该值赋值
      +            return ix;
      +        }
      +        perturb >>= PERTURB_SHIFT;                      // 偏移
      +        i = mask & (i*5 + perturb + 1);                   // 获取下一个位置
      +    }
      +    Py_UNREACHABLE();
      +}
      +
      +

      该函数的主要工作就是查找,字典中是否有空余的值,或者如果找到了满足 hash 值与 key 相同的就将 value 设置为找到的值(这也是字典查找的核心逻辑)。至此,字典的插入的大致流程已经分析完毕。

      +

      Python 字典的操作测试

      +

      现在我们动手观看一下具体的操作实例,首先声明,该例子仅供调试使用,目前调试的字典的 key 与 value 都是 float 类型并且不能 del 或者 pop 其中的 key。操作字典如下所示;

      +
      = {20000:2}
      +d[1] = 2
      +d[3] = 2
      +
      +

      首先,讲如下代码插入到 dictobject.c 的 1060 行;

      +
      // 测试代码
      +PyObject* key1 = PyLong_FromLong(20000);
      +Py_hash_t hash1 = PyObject_Hash(key1);
      +PyObject* old_value1;
      +Py_ssize_t ix1 = mp->ma_keys->dk_lookup(mp, key1, hash1, &old_value1);
      +if (ix1 == 0){
      +    PyLongObject* give;
      +    give = (PyLongObject* )key1;
      +    printf("found value : %ld\n", give->ob_digit[0]);
      +    PyDictKeyEntry *ep01 = DK_ENTRIES(mp->ma_keys);
      +    int i, count;
      +    count = mp->ma_used;
      +    int size_count, j;
      +    size_count = mp->ma_keys->dk_size;
      +    printf("%s ", mp->ma_keys->dk_indices);
      +    int8_t *indices = (int8_t*)(mp->ma_keys->dk_indices);
      +    printf("indices index values :");
      +    for (j=0; j<size_count;j++){
      +        printf("%d  ",(char) indices[j]);
      +    }
      +    printf("\n");
      +    for (i=0; i<count;i++){
      +        give = (PyLongObject* )ep01->me_key;
      +        printf("size : %d ", mp->ma_keys->dk_size);
      +        printf("found value while  key : %ld   ", give->ob_digit[0]);
      +        give = (PyLongObject* )ep01->me_value;
      +        printf("value  : %ld\n", give->ob_digit[0]);
      +        ep01++;
      +    }
      +}
      +
      +

      然后编译运行;

      +
      Python 3.7.3 (default, May 22 2019, 16:17:57)
      +[GCC 7.3.0] on linux
      +Type "help", "copyright", "credits" or "license" for more information.
      +>>> d = {20000:2}
      +found value : 20000
      + indices index values :0  -1  -1  -1  -1  -1  -1  -1
      +size : 8 found value while  key : 20000   value  : 2
      +
      +

      其中为什么初始化的时候输入 20000,是根据代码找到相关的 key 值,因为字典也被 python 自身实现的结构中引用了多次,所以我们就设置了一个特殊值来跟踪我们想要的字典;当 d 初始化的时候,就输出如上所示内容;我们接下来继续操作;

      +
      >>> d = {20000:2}
      +found value : 20000
      + indices index values :0  -1  -1  -1  -1  -1  -1  -1
      +size : 8 found value while  key : 20000   value  : 2
      +>>> d[2] = 3
      +found value : 20000
      + indices index values :0  -1  1  -1  -1  -1  -1  -1
      +size : 8 found value while  key : 20000   value  : 2
      +size : 8 found value while  key : 2   value  : 3
      +>>> d[3] = 4
      +found value : 20000
      + indices index values :0  -1  1  2  -1  -1  -1  -1
      +size : 8 found value while  key : 20000   value  : 2
      +size : 8 found value while  key : 2   value  : 3
      +size : 8 found value while  key : 3   value  : 4
      +>>> d[5] = 6
      +found value : 20000
      + indices index values :0  -1  1  2  -1  3  -1  -1
      +size : 8 found value while  key : 20000   value  : 2
      +size : 8 found value while  key : 2   value  : 3
      +size : 8 found value while  key : 3   value  : 4
      +size : 8 found value while  key : 5   value  : 6
      +>>> d[7] = 8
      +found value : 20000
      + indices index values :0  -1  1  2  -1  3  -1  4
      +size : 8 found value while  key : 20000   value  : 2
      +size : 8 found value while  key : 2   value  : 3
      +size : 8 found value while  key : 3   value  : 4
      +size : 8 found value while  key : 5   value  : 6
      +size : 8 found value while  key : 7   value  : 8
      +
      +

      此后我们一直添加值进 d,从输出信息可知,index 就是记录了 PyDictKeyEntry 的索引值,-1 就表示该处未使用。 +当我们继续向 d 中添加内容时;

      +
      >>> d[9] = 10
      +found value : 20000
      + indices index values :0  -1  1  2  -1  3  -1  4  -1  5  -1  -1  -1  -1  -1  -1
      +size : 16 found value while  key : 20000   value  : 2
      +size : 16 found value while  key : 2   value  : 3
      +size : 16 found value while  key : 3   value  : 4
      +size : 16 found value while  key : 5   value  : 6
      +size : 16 found value while  key : 7   value  : 8
      +size : 16 found value while  key : 9   value  : 10
      +>>> d[10] = 11
      +found value : 20000
      + indices index values :0  -1  1  2  -1  3  -1  4  -1  5  6  -1  -1  -1  -1  -1
      +size : 16 found value while  key : 20000   value  : 2
      +size : 16 found value while  key : 2   value  : 3
      +size : 16 found value while  key : 3   value  : 4
      +size : 16 found value while  key : 5   value  : 6
      +size : 16 found value while  key : 7   value  : 8
      +size : 16 found value while  key : 9   value  : 10
      +size : 16 found value while  key : 10   value  : 11
      +
      +

      从输出内容可知,字典的大小随之改变了,这也说明了 python 字典的最佳大小容量限定在 1/2 到 2/3 之间,如果超过这个阈值则字典就会自动扩容,扩容的策略大家可详细查看源码。

      +
      Copyright © FlagGo 2019 all right reserved,powered by Gitbook该文件修订时间: +2020-03-23 19:36:27 +
      + +
      + +
      +
      +
      + +

      results matching ""

      +
        + +
        +
        + +

        No results matching ""

        + +
        +
        +
        + +
        +
        + +
        + + + + + + + + + + + + + + +
        + + +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/objects/dict-object/index.md b/objects/dict-object/index.md deleted file mode 100644 index cdc42ce..0000000 --- a/objects/dict-object/index.md +++ /dev/null @@ -1,722 +0,0 @@ -# Python 字典 - -Dictionary object implementation using a hash table ,通过描述可知,python 的字典就是实现了一个 hash 表。 - -## Python 字典概述 - -在 python 的字典中,一个键值对的对应保存就是 PyDictEntry 类型来保存; - -`源文件:`[Include/dict-common.h](https://github.com/python/cpython/blob/v3.7.0/Objects/dict-common.h#L1) - -```c -// Objects/dict-common.h -typedef struct { - /* Cached hash code of me_key. */ - Py_hash_t me_hash; - PyObject *me_key; - PyObject *me_value; /* This field is only meaningful for combined tables */ -} PyDictKeyEntry;  -``` - -其中,me_hash 就是哈希生成的值,me_key 就是对应的 key 值,me_value 就是对应的值。 -在 python 中,在一个 PyDictObject 对象的变化过程中,entry 的状态会在不同的状态间转换。基本上在如下四种状态中转换:Unused、Active、Dummy 和 Pending。 - -1. Unused:没有插入任何一个获取的 key 与 value,并且在此之前也没有存储任何的 key,value,每一个 entry 在初始化的时候都会处于这种状态,并且 Unused 会被里面切换到 Active 态,当有 key 插入,这就是 entry 初始化的状态。 -2. Active:当 index>=0 时,me_key 不为空并且 me_value 不为空,保存了一个键值对,Active 可以转变为 Dummy 或者 Pending 状态,当一个键被删除的时候,这只会在 me_value 不为空的时候出现。 -3. Dummy:先前保存了一个 Active 的键值对,但是这个键值对被删除了并且一个活跃的键值对还没有填入该位置,Dummy 可以转变为 Active 当删除的时候,Dummy 的位置不能被重新使用,一旦发生碰撞,探针序列就无法知道这对键值对曾是活跃的键值对。 -4. Pending:索引>=0,键!=空,值=空(仅拆分),尚未插入到拆分表中。 - -## 字典的两种类型 - -python 的字典类型中包含了两种,分离字典(split-table dictionaries)与联合字典(combined-table dictonaries)。详细的信息可查看有关 dict 的描述[pep-0412](https://www.python.org/dev/peps/pep-0412/)。 - -### split-table dictionaries - -当被创建的字典是用来保存 object 的\_\_dict\_\_属性时,该字典才会创建为一个 split-table,它们的键表都被缓存在类型属性中,并且允许所有该类型的实例都可以共享该 keys。当出现一个事件将字典的属性值进行改变的时候,个别字典将慢慢的转化成组合表的形式。这就保证了在大部分的应用场景下很高的内存利用效率,并保证了在各个场景下的正确性。当 split-dict 重新改变大小,它会立马改变为一个 combined-table,如果重置大小作为保存实例属性的结果,并且只有一个该 object 的实例,字典会立马再变为一个 split-table。如果从 split-table 中删除一个 key, value,它不会删除 keys tables 中对应的该值,而只是将 values 数值中移除了该 value。 - -### combined-table dictionaries - -直接通过 dict 內建函数与{}生成的字典,模块和大部分其他字典都会创建为 combined-table 字典,一个 combined-table 不会改变为一个 split-table 字典,该字典的行为方式与最初的字典的行为方式大致相同。 - -## 容器的相关数据结构 - -字典对象是通过 PyDictObject 来实现数据的,详情如下; - -`源文件:`[Include/dictobject.h](https://github.com/python/cpython/blob/v3.7.0/Include/dictobject.h#L17) - -```c -// Include/dictobject.h -typedef struct _dictkeysobject PyDictKeysObject; - -/* The ma_values pointer is NULL for a combined table - * or points to an array of PyObject* for a split table - */ -typedef struct { - PyObject_HEAD - - /* Number of items in the dictionary */ - Py_ssize_t ma_used;  // 使用的keys个数 - - /* Dictionary version: globally unique, value change each time - the dictionary is modified */ - uint64_t ma_version_tag; - - PyDictKeysObject *ma_keys;     // 如果有则是保存的keys数据 - - /* If ma_values is NULL, the table is "combined": keys and values - are stored in ma_keys. - - If ma_values is not NULL, the table is splitted: - keys are stored in ma_keys and values are stored in ma_values */ - PyObject **ma_values;  // 如果不为空则保存的是values -} PyDictObject; -``` - -其中,PyDictKeysObject 的定义如下; - -`源文件:`[Include/dict-common.h](https://github.com/python/cpython/blob/v3.7.0/Objects/dict-common.h#L20) - -```c -// Objects/dict-common.h -/* See dictobject.c for actual layout of DictKeysObject */ -struct _dictkeysobject { - Py_ssize_t dk_refcnt;                  // 引用计数 - - /* Size of the hash table (dk_indices). It must be a power of 2. */ - Py_ssize_t dk_size;                   // hash table 的大小必须是2的倍数 - - /* Function to lookup in the hash table (dk_indices): - - - lookdict(): general-purpose, and may return DKIX_ERROR if (and - only if) a comparison raises an exception. - - - lookdict_unicode(): specialized to Unicode string keys, comparison of - which can never raise an exception; that function can never return - DKIX_ERROR. - - - lookdict_unicode_nodummy(): similar to lookdict_unicode() but further - specialized for Unicode string keys that cannot be the value. - - - lookdict_split(): Version of lookdict() for split tables. */ - dict_lookup_func dk_lookup; // 哈希查找函数 - - /* Number of usable entries in dk_entries. */ - Py_ssize_t dk_usable; // 可用的entry数量 - - /* Number of used entries in dk_entries. */  - Py_ssize_t dk_nentries;          // 已经使用的entry数量 - - /* Actual hash table of dk_size entries. It holds indices in dk_entries, - or DKIX_EMPTY(-1) or DKIX_DUMMY(-2). - - Indices must be: 0 <= indice < USABLE_FRACTION(dk_size). - - The size in bytes of an indice depends on dk_size: - - - 1 byte if dk_size <= 0xff (char*) - - 2 bytes if dk_size <= 0xffff (int16_t*) - - 4 bytes if dk_size <= 0xffffffff (int32_t*) - - 8 bytes otherwise (int64_t*) - - Dynamically sized, SIZEOF_VOID_P is minimum. */ - char dk_indices[]; /* char is required to avoid strict aliasing. */   // 存入的entries - - /* "PyDictKeyEntry dk_entries[dk_usable];" array follows: - see the DK_ENTRIES() macro */ -}; -``` - -相关数据结构的内存布局为; -![python_dict_mem](dict-mem.png) - -## Python 字典示例 - -本次示例脚本如下: - -```python -d = {} -d['1']='2' -d['1']='e' -d.pop('1') - -``` - -通过 Python 的反汇编工具获取字节码; - -```shell -python -m dis dict_test.py -``` - -输出的字节码如下; - -```shell - 2 0 BUILD_MAP 0 - 2 STORE_NAME 0 (d) - - 3 4 LOAD_CONST 0 ('2') - 6 LOAD_NAME 0 (d) - 8 LOAD_CONST 1 ('1') - 10 STORE_SUBSCR - - 4 12 LOAD_CONST 2 ('e') - 14 LOAD_NAME 0 (d) - 16 LOAD_CONST 1 ('1') - 18 STORE_SUBSCR - - 5 20 LOAD_NAME 0 (d) - 22 LOAD_METHOD 1 (pop) - 24 LOAD_CONST 1 ('1') - 26 CALL_METHOD 1 - 28 POP_TOP - 30 LOAD_CONST 3 (None) - 32 RETURN_VALUE -``` - -通过字节码指令可知,首先调用了 BUILD_MAP 来创建一个新的字典,接着就对新建的字典 d 进行了赋值操作与更新操作,最后调用了 pop 方法删除一个 key。接下来就详细分析一下相关流程。 - -## 字典的初始化流程 - -通过查找 BUILD_MAP 的虚拟机执行函数; - -`源文件:`[Python/ceval.c](https://github.com/python/cpython/blob/v3.7.0/Python/ceval.c#L2357) - -```c -// Python/ceval.c -switch (opcode) { - ... - - TARGET(BUILD_MAP) { - Py_ssize_t i; - PyObject *map = _PyDict_NewPresized((Py_ssize_t)oparg); // 新建并初始化一个字典 - if (map == NULL) - goto error;  // 如果新建失败则报错 - for (i = oparg; i > 0; i--) {   // 检查在新建的过程中是否通过参数传值 - int err; - PyObject *key = PEEK(2*i); - PyObject *value = PEEK(2*i - 1); - err = PyDict_SetItem(map, key, value);      // 找到对应的值并讲该值设置到map中 - if (err != 0) {                        // 检查是否报错 - Py_DECREF(map); - goto error;                        // 如果错误就报错处理 - } - } - - while (oparg--) { - Py_DECREF(POP());                       // 弹出栈上输入参数的引用 - Py_DECREF(POP()); - } - PUSH(map);                              // 讲生成的map压栈 - DISPATCH();                             // 检查是否需要执行下一条字节码指令 - } -} -``` - -从该函数的执行可知,初始化的函数是从\_PyDict_NewPresized 开始,该函数就是生成并初始化一个字典; - -`源文件:`[Objects/dictobject.c](https://github.com/python/cpython/blob/v3.7.0/Objects/dictobject.c#L1240) - -```c -// Objects/dictobject.c - -PyObject * -_PyDict_NewPresized(Py_ssize_t minused) -{ - const Py_ssize_t max_presize = 128 * 1024;  // 字典最大的容量 - Py_ssize_t newsize; - PyDictKeysObject *new_keys; - - /* There are no strict guarantee that returned dict can contain minused - * items without resize. So we create medium size dict instead of very - * large dict or MemoryError. - */ - if (minused > USABLE_FRACTION(max_presize)) { // 检查传入的数量是否超过最大值 - newsize = max_presize; - } - else { - Py_ssize_t minsize = ESTIMATE_SIZE(minused); // 获取最小的值,在新建一个空的字典的时候该值为0 - newsize = PyDict_MINSIZE; // 设置字典的最小值 为8 - while (newsize < minsize) { // 如果传入的值大于最小值则调整newsize 大小 - newsize <<= 1; - } - } - assert(IS_POWER_OF_2(newsize)); - - new_keys = new_keys_object(newsize); // 生成并初始化一个PyDictKeysObject对象 - if (new_keys == NULL) - return NULL; - return new_dict(new_keys, NULL); // 生成一个新的对象并返回 -} -``` - -首先,先计算出需要生成的字典的大小,然后再初始化一个 PyDictKeysObject,最后就生成一个 PyDictObject 返回。继续查看 new_keys_object 的执行流程; - -`源文件:`[Objects/dictobject.c](https://github.com/python/cpython/blob/v3.7.0/Objects/dictobject.c#L503) - -```c -// Objects/dictobject.c - -static PyDictKeysObject *new_keys_object(Py_ssize_t size) -{ - PyDictKeysObject *dk; - Py_ssize_t es, usable; - - assert(size >= PyDict_MINSIZE); // 检查size是否大于最小size - assert(IS_POWER_OF_2(size)); // 检查是否是2的倍数 - - usable = USABLE_FRACTION(size); // 检查是否可用  根据经验在1/2和2/3之间效果最好 - if (size <= 0xff) { - es = 1; - } - else if (size <= 0xffff) { - es = 2; - } -#if SIZEOF_VOID_P > 4 - else if (size <= 0xffffffff) { - es = 4; - } -#endif - else { - es = sizeof(Py_ssize_t); - } - - if (size == PyDict_MINSIZE && numfreekeys > 0) {      // 是否有缓存,如果有缓存就选择缓存中的dk - dk = keys_free_list[--numfreekeys]; - } - else { - dk = PyObject_MALLOC(sizeof(PyDictKeysObject) - + es * size - + sizeof(PyDictKeyEntry) * usable); // 没有缓存可使用的字典则申请内存生成一个 - if (dk == NULL) { - PyErr_NoMemory(); - return NULL; - } - } - DK_DEBUG_INCREF dk->dk_refcnt = 1; // 设置引用计数 - dk->dk_size = size; // 设置大小 - dk->dk_usable = usable; // 设置是否可用 - dk->dk_lookup = lookdict_unicode_nodummy; // 设置查找函数 - dk->dk_nentries = 0; - memset(&dk->dk_indices[0], 0xff, es * size); // 将申请的内存置空 - memset(DK_ENTRIES(dk), 0, sizeof(PyDictKeyEntry) * usable); - return dk; -} -``` - -主要就是通过传入的 size,检查是否超过设置的大小,检查是否有缓存的字典数据可用,如果没有则申请内存重新生成一个 dk,最后进行申请到的内存讲内容清空。接着就会进行 new_dict 初始化数据; - -`源文件:`[Objects/dictobject.c](https://github.com/python/cpython/blob/v3.7.0/Objects/dictobject.c#L568) - -```c -// Objects/dictobject.c - -/* Consumes a reference to the keys object */ -static PyObject * -new_dict(PyDictKeysObject *keys, PyObject **values) -{ - PyDictObject *mp; - assert(keys != NULL); - if (numfree) {                            // 判断缓冲池是否有 - mp = free_list[--numfree]; - assert (mp != NULL); - assert (Py_TYPE(mp) == &PyDict_Type);  - _Py_NewReference((PyObject *)mp);              // 使用缓冲池对象     - } - else { - mp = PyObject_GC_New(PyDictObject, &PyDict_Type);    // 缓冲池没有则申请新的对象并初始化 - if (mp == NULL) { - DK_DECREF(keys); - free_values(values); - return NULL; - } - } - mp->ma_keys = keys; - mp->ma_values = values; - mp->ma_used = 0;                           // 设置ma_used为0 - mp->ma_version_tag = DICT_NEXT_VERSION(); - assert(_PyDict_CheckConsistency(mp)); - return (PyObject *)mp; -} -``` - -new_dict 就是根据 keys,values 设置到从缓冲池或者新生成一个 dict 对象,最后返回。至此,dict 的创建工作已经完成。 - -## 字典的插入与查找 - -通过字节码的指令 STORE_SUBSCR 可知,该命令就是讲'1'作为 key, '2'作为 value 插入到 d 中,此时查看该执行函数; - -`源文件:`[Python/ceval.c](https://github.com/python/cpython/blob/v3.7.0/Python/ceval.c#L1561) - -```c -// Python/ceval.c -switch (opcode) { - ... - - TARGET(STORE_SUBSCR) { - PyObject *sub = TOP(); // 第一个值为key - PyObject *container = SECOND(); // 该为字典对象 - PyObject *v = THIRD(); // 该为value - int err; - STACKADJ(-3); - /* container[sub] = v */ - err = PyObject_SetItem(container, sub, v); // 调用该方法设置值 - Py_DECREF(v); - Py_DECREF(container); - Py_DECREF(sub); - if (err != 0) - goto error; - DISPATCH(); - } -} -``` - -此时,从栈中取出相关参数,并将这些值传入 PyObject_SetItem 函数进行处理设置值; - -`源文件:`[Objects/abstract.c](https://github.com/python/cpython/blob/v3.7.0/Objects/abstract.c#L186) - -```c -// Objects/abstract.c -int -PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value) -{ - PyMappingMethods *m; - - if (o == NULL || key == NULL || value == NULL) {           // 检查是否为空如果任一为空则报错 - null_error(); - return -1; - } - m = o->ob_type->tp_as_mapping;                      // 获取类型的tp_as_mapping方法集      - if (m && m->mp_ass_subscript)                       // 如果有设置该类型 - return m->mp_ass_subscript(o, key, value); // 调用该mp_ass_subscript方法 - - if (o->ob_type->tp_as_sequence) { // 获取作为队列的操作集 - if (PyIndex_Check(key)) {                       // 检查key是否是索引 - Py_ssize_t key_value; - key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);  - if (key_value == -1 && PyErr_Occurred()) - return -1; - return PySequence_SetItem(o, key_value, value);       // 调用索引插入 - } - else if (o->ob_type->tp_as_sequence->sq_ass_item) { - type_error("sequence index must be " - "integer, not '%.200s'", key); - return -1; - } - } - - type_error("'%.200s' object does not support item assignment", o);   // 则该类型对象不支持设置 - return -1; -} -``` - -其中就调用了字典的 tp_as_mapping 的方法集,并调用了该方法集的 mp_ass_subscript 方法;此时我们分析一下,dict 的 tp_as_mapping 的方法集。此时就调用了 tp_as_mapping 的 mp_ass_subscript 方法,此时就是调用 dict 的 dict_ass_sub 方法; - -`源文件:`[Objects/dictobject.c](https://github.com/python/cpython/blob/v3.7.0/Objects/dictobject.c#L2040) - -```c -// Objects/dictobject.c -static int -dict_ass_sub(PyDictObject *mp, PyObject *v, PyObject *w) -{ - if (w == NULL) - return PyDict_DelItem((PyObject *)mp, v); - else - return PyDict_SetItem((PyObject *)mp, v, w); -} -``` - -可知,删除一个 key 就是 PyDict_DelItem,设置一个 key 就是 PyDict_SetItem; - -`源文件:`[Objects/dictobject.c](https://github.com/python/cpython/blob/v3.7.0/Objects/dictobject.c#L1433) - -```c -// Objects/dictobject.c -int -PyDict_SetItem(PyObject *op, PyObject *key, PyObject *value) -{ - PyDictObject *mp; - Py_hash_t hash; - if (!PyDict_Check(op)) {            // 检查是否是字典类型 - PyErr_BadInternalCall(); - return -1; - } - assert(key); - assert(value); - mp = (PyDictObject *)op; - if (!PyUnicode_CheckExact(key) || - (hash = ((PyASCIIObject *) key)->hash) == -1)  // 检查传入的key是否hash为-1 - { - hash = PyObject_Hash(key); // 生成hash调用key对应的tp_hash方法,在本例中传入的是str类型,则调用str类型的tp_hash方法 - if (hash == -1) - return -1; - } - - /* insertdict() handles any resizing that might be necessary */ - return insertdict(mp, key, hash, value); // 生成hash调用key对应的tp_hash方法 -} - -``` - -insertdict 方法就是将生成的方法,插入到字典中去; - -`源文件:`[Objects/dictobject.c](https://github.com/python/cpython/blob/v3.7.0/Objects/dictobject.c#L987) - -```c -// Objects/dictobject.c -static int -insertdict(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject *value) -{ - PyObject *old_value; - PyDictKeyEntry *ep; - - Py_INCREF(key); - Py_INCREF(value); - if (mp->ma_values != NULL && !PyUnicode_CheckExact(key)) { - if (insertion_resize(mp) < 0) // 重新设置mp的大小 如果ma_values有值 - goto Fail; - } - - Py_ssize_t ix = mp->ma_keys->dk_lookup(mp, key, hash, &old_value);     // 调用查找方法 - if (ix == DKIX_ERROR) - goto Fail; - - assert(PyUnicode_CheckExact(key) || mp->ma_keys->dk_lookup == lookdict); - MAINTAIN_TRACKING(mp, key, value); // 检查mp key values是否需要加入垃圾回收 - - /* When insertion order is different from shared key, we can't share - * the key anymore. Convert this instance to combine table. - */ - if (_PyDict_HasSplitTable(mp) && - ((ix >= 0 && old_value == NULL && mp->ma_used != ix) || - (ix == DKIX_EMPTY && mp->ma_used != mp->ma_keys->dk_nentries))) {  // 检查是否是分离表,如果没查找到旧值并且 - if (insertion_resize(mp) < 0)                         // 重新设置该字典大小 - goto Fail; - ix = DKIX_EMPTY; - } - - if (ix == DKIX_EMPTY) { - /* Insert into new slot. */ - assert(old_value == NULL); - if (mp->ma_keys->dk_usable <= 0) {                      // 如果可用的值小于0 - /* Need to resize. */ - if (insertion_resize(mp) < 0)                       // 需要重新扩展字典大小 - goto Fail; - } - Py_ssize_t hashpos = find_empty_slot(mp->ma_keys, hash);         // 查找一个可用的hash位置 - ep = &DK_ENTRIES(mp->ma_keys)[mp->ma_keys->dk_nentries];         // 获取存取的地址 - dk_set_index(mp->ma_keys, hashpos, mp->ma_keys->dk_nentries);      // 设置该值 - ep->me_key = key;                                 // 保存key - ep->me_hash = hash; // 保存计算得出的hash值 - if (mp->ma_values) {                               // 如果mp的ma_values有值 - assert (mp->ma_values[mp->ma_keys->dk_nentries] == NULL); - mp->ma_values[mp->ma_keys->dk_nentries] = value;           // 设置该key对应的value - } - else { - ep->me_value = value; // 直接讲value设置到entry上面 - } - mp->ma_used++;                                   // 使用个数加1 - mp->ma_version_tag = DICT_NEXT_VERSION();   - mp->ma_keys->dk_usable--;                            // 可用减1 - mp->ma_keys->dk_nentries++; - assert(mp->ma_keys->dk_usable >= 0); - assert(_PyDict_CheckConsistency(mp)); - return 0; - } - - if (_PyDict_HasSplitTable(mp)) { // 如果是分离的 - mp->ma_values[ix] = value; // 直接设置ma_values对应的ix到values中 - if (old_value == NULL) { - /* pending state */ - assert(ix == mp->ma_used); - mp->ma_used++;                               // 使用加1 - } - } - else { - assert(old_value != NULL); - DK_ENTRIES(mp->ma_keys)[ix].me_value = value; - } - - mp->ma_version_tag = DICT_NEXT_VERSION(); - Py_XDECREF(old_value); /* which **CAN** re-enter (see issue #22653) */ - assert(_PyDict_CheckConsistency(mp)); - Py_DECREF(key); - return 0; - -Fail: - Py_DECREF(value); - Py_DECREF(key); - return -1; -} -``` - -首先会调用相关的查找方法,去查找待搜索的值是否已经存在字典中,如果当前字典数据已经满了则会按照增长大小的函数生成一个新的字典,并把旧数据设置到新的字典中,当找到的字典匹配时则返回。 - -其中 dk_lookup 对应的方法,在初始化之后对应的是 lookdict_unicode_nodummy; - -`源文件:`[Objects/dictobject.c](https://github.com/python/cpython/blob/v3.7.0/Objects/dictobject.c#L813) - -```c -// Objects/dictobject.c - -/* Faster version of lookdict_unicode when it is known that no keys - * will be present. */ -static Py_ssize_t _Py_HOT_FUNCTION -lookdict_unicode_nodummy(PyDictObject *mp, PyObject *key, - Py_hash_t hash, PyObject **value_addr) -{ - assert(mp->ma_values == NULL); - /* Make sure this function doesn't have to handle non-unicode keys, - including subclasses of str; e.g., one reason to subclass - unicodes is to override __eq__, and for speed we don't cater to - that here. */ - if (!PyUnicode_CheckExact(key)) {                     // 检查如果不是unicode则直接调用lookdict方法查找 - mp->ma_keys->dk_lookup = lookdict; - return lookdict(mp, key, hash, value_addr); - } - - PyDictKeyEntry *ep0 = DK_ENTRIES(mp->ma_keys);             // 获取keys的首个元素地址 - size_t mask = DK_MASK(mp->ma_keys);                    // 获取大小 - size_t perturb = (size_t)hash; - size_t i = (size_t)hash & mask;                       // 获取生成的最终的值                  - - for (;;) { - Py_ssize_t ix = dk_get_index(mp->ma_keys, i); // 便利ma_keys key列表 - assert (ix != DKIX_DUMMY);                     // 判断不能为空 - if (ix == DKIX_EMPTY) { // 如果为空则证明找到一个可以使用的 - *value_addr = NULL;                       // 讲key对应的value设置为空 - return DKIX_EMPTY;                        // 返回 - } - PyDictKeyEntry *ep = &ep0[ix];             // 获取该位置元素值 - assert(ep->me_key != NULL); - assert(PyUnicode_CheckExact(ep->me_key)); - if (ep->me_key == key || - (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {  // 如果key相同 hash值也相同 - *value_addr = ep->me_value;                    // 将该值赋值 - return ix; - } - perturb >>= PERTURB_SHIFT;                      // 偏移 - i = mask & (i*5 + perturb + 1);                   // 获取下一个位置 - } - Py_UNREACHABLE(); -} -``` - -该函数的主要工作就是查找,字典中是否有空余的值,或者如果找到了满足 hash 值与 key 相同的就将 value 设置为找到的值(这也是字典查找的核心逻辑)。至此,字典的插入的大致流程已经分析完毕。 - -## Python 字典的操作测试 - -现在我们动手观看一下具体的操作实例,首先声明,该例子仅供调试使用,目前调试的字典的 key 与 value 都是 float 类型并且不能 del 或者 pop 其中的 key。操作字典如下所示; - -```python -d = {20000:2} -d[1] = 2 -d[3] = 2 -``` - -首先,讲如下代码插入到 dictobject.c 的 1060 行; - -```c -// 测试代码 -PyObject* key1 = PyLong_FromLong(20000); -Py_hash_t hash1 = PyObject_Hash(key1); -PyObject* old_value1; -Py_ssize_t ix1 = mp->ma_keys->dk_lookup(mp, key1, hash1, &old_value1); -if (ix1 == 0){ - PyLongObject* give; - give = (PyLongObject* )key1; - printf("found value : %ld\n", give->ob_digit[0]); - PyDictKeyEntry *ep01 = DK_ENTRIES(mp->ma_keys); - int i, count; - count = mp->ma_used; - int size_count, j; - size_count = mp->ma_keys->dk_size; - printf("%s ", mp->ma_keys->dk_indices); - int8_t *indices = (int8_t*)(mp->ma_keys->dk_indices); - printf("indices index values :"); - for (j=0; jme_key; - printf("size : %d ", mp->ma_keys->dk_size); - printf("found value while  key : %ld ", give->ob_digit[0]); - give = (PyLongObject* )ep01->me_value; - printf("value : %ld\n", give->ob_digit[0]); - ep01++; - } -} -``` - -然后编译运行; - -```python -Python 3.7.3 (default, May 22 2019, 16:17:57) -[GCC 7.3.0] on linux -Type "help", "copyright", "credits" or "license" for more information. ->>> d = {20000:2} -found value : 20000 - indices index values :0 -1 -1 -1 -1 -1 -1 -1 -size : 8 found value while  key : 20000 value : 2 -``` - -其中为什么初始化的时候输入 20000,是根据代码找到相关的 key 值,因为字典也被 python 自身实现的结构中引用了多次,所以我们就设置了一个特殊值来跟踪我们想要的字典;当 d 初始化的时候,就输出如上所示内容;我们接下来继续操作; - -```python ->>> d = {20000:2} -found value : 20000 - indices index values :0 -1 -1 -1 -1 -1 -1 -1 -size : 8 found value while  key : 20000 value : 2 ->>> d[2] = 3 -found value : 20000 - indices index values :0 -1 1 -1 -1 -1 -1 -1 -size : 8 found value while  key : 20000 value : 2 -size : 8 found value while  key : 2 value : 3 ->>> d[3] = 4 -found value : 20000 - indices index values :0 -1 1 2 -1 -1 -1 -1 -size : 8 found value while  key : 20000 value : 2 -size : 8 found value while  key : 2 value : 3 -size : 8 found value while  key : 3 value : 4 ->>> d[5] = 6 -found value : 20000 - indices index values :0 -1 1 2 -1 3 -1 -1 -size : 8 found value while  key : 20000 value : 2 -size : 8 found value while  key : 2 value : 3 -size : 8 found value while  key : 3 value : 4 -size : 8 found value while  key : 5 value : 6 ->>> d[7] = 8 -found value : 20000 - indices index values :0 -1 1 2 -1 3 -1 4 -size : 8 found value while  key : 20000 value : 2 -size : 8 found value while  key : 2 value : 3 -size : 8 found value while  key : 3 value : 4 -size : 8 found value while  key : 5 value : 6 -size : 8 found value while  key : 7 value : 8 -``` - -此后我们一直添加值进 d,从输出信息可知,index 就是记录了 PyDictKeyEntry 的索引值,-1 就表示该处未使用。 -当我们继续向 d 中添加内容时; - -```python ->>> d[9] = 10 -found value : 20000 - indices index values :0 -1 1 2 -1 3 -1 4 -1 5 -1 -1 -1 -1 -1 -1 -size : 16 found value while  key : 20000 value : 2 -size : 16 found value while  key : 2 value : 3 -size : 16 found value while  key : 3 value : 4 -size : 16 found value while  key : 5 value : 6 -size : 16 found value while  key : 7 value : 8 -size : 16 found value while  key : 9 value : 10 ->>> d[10] = 11 -found value : 20000 - indices index values :0 -1 1 2 -1 3 -1 4 -1 5 6 -1 -1 -1 -1 -1 -size : 16 found value while  key : 20000 value : 2 -size : 16 found value while  key : 2 value : 3 -size : 16 found value while  key : 3 value : 4 -size : 16 found value while  key : 5 value : 6 -size : 16 found value while  key : 7 value : 8 -size : 16 found value while  key : 9 value : 10 -size : 16 found value while  key : 10 value : 11 -``` - -从输出内容可知,字典的大小随之改变了,这也说明了 python 字典的最佳大小容量限定在 1/2 到 2/3 之间,如果超过这个阈值则字典就会自动扩容,扩容的策略大家可详细查看源码。 diff --git a/objects/list-object/index.html b/objects/list-object/index.html new file mode 100644 index 0000000..d09747f --- /dev/null +++ b/objects/list-object/index.html @@ -0,0 +1,831 @@ + + + + + + + Python List 对象 · Python 3 源码分析 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        + + + + + + + + +
        + +
        + +
        + + + + + + + + +
        +
        + +
        +
        + +
        + +

        Python List 对象

        +

        在Python中的list可以存放任何类型的数据,查看PyListObject可以发现,list实际存放的是PyObject* 指针

        +

        PyListObject

        +

        源文件:Include/listobject.h

        +
        // listobject.h
        +
        +typedef struct {
        +    PyObject_VAR_HEAD
        +    /* Vector of pointers to list elements.  list[0] is ob_item[0], etc. */
        +    PyObject **ob_item;
        +
        +    /* ob_item contains space for 'allocated' elements.  The number
        +     * currently in use is ob_size.
        +     * Invariants:
        +     *     0 <= ob_size <= allocated
        +     *     len(list) == ob_size
        +     *     ob_item == NULL implies ob_size == allocated == 0
        +     * list.sort() temporarily sets allocated to -1 to detect mutations.
        +     *
        +     * Items must normally not be NULL, except during construction when
        +     * the list is not yet visible outside the function that builds it.
        +     */
        +
        +    // 可容纳元素的总数
        +    Py_ssize_t allocated;
        +} PyListObject;
        +
        +

        示例

        +
        lst = []
        +lst.append(1)
        +
        +

        其存储结构如下图

        +

        PyList structure

        +

        PyListObject对象的一些操作

        +
          +
        • 创建PyListObject PyList_New
        • +
        • 对象赋值 PyList_SetItem
        • +
        • 获取元素 PyList_GetItem
        • +
        • 插入元素 PyList_Insert
        • +
        • 追加元素 PyList_Append
        • +
        • 移除元素 list_remove
        • +
        • 调整list大小 list_resize
        • +
        +

        PyList_New 创建对象

        +

        为了避免频繁的申请内存空间,创建PyListObject的时候会先检查缓冲池是否有可用空间

        +

        源文件:Objects/listobject.c

        +
        // listobject.c
        +
        +PyObject *
        +PyList_New(Py_ssize_t size)
        +{
        +    PyListObject *op;
        +#ifdef SHOW_ALLOC_COUNT
        +    static int initialized = 0;
        +    if (!initialized) {
        +        Py_AtExit(show_alloc);
        +        initialized = 1;
        +    }
        +#endif
        +
        +    // size 合法性检查
        +    if (size < 0) {
        +        PyErr_BadInternalCall();
        +        return NULL;
        +    }
        +
        +    // PyListObject对象缓冲池是否有可用空间
        +    if (numfree) {
        +        numfree--;
        +        op = free_list[numfree];
        +        _Py_NewReference((PyObject *)op);
        +#ifdef SHOW_ALLOC_COUNT
        +        count_reuse++;
        +#endif
        +    } else {
        +        // 缓冲池满只能向系统申请内存
        +        op = PyObject_GC_New(PyListObject, &PyList_Type);
        +        if (op == NULL)
        +            return NULL;
        +#ifdef SHOW_ALLOC_COUNT
        +        count_alloc++;
        +#endif
        +    }
        +    if (size <= 0)
        +        op->ob_item = NULL;
        +    else {
        +        op->ob_item = (PyObject **) PyMem_Calloc(size, sizeof(PyObject *));
        +        if (op->ob_item == NULL) {
        +            Py_DECREF(op);
        +            return PyErr_NoMemory();
        +        }
        +    }
        +    Py_SIZE(op) = size;
        +    op->allocated = size;
        +    _PyObject_GC_TRACK(op);
        +    return (PyObject *) op;
        +}
        +
        +

        PyListObject缓冲池默认大小为80 源文件:Include/listobject.c

        +
        // listobject.c
        +
        +/* Empty list reuse scheme to save calls to malloc and free */
        +#ifndef PyList_MAXFREELIST
        +#define PyList_MAXFREELIST 80
        +#endif
        +static PyListObject *free_list[PyList_MAXFREELIST];
        +static int numfree = 0;
        +
        +

        PyList_SetItem 元素赋值

        +

        源文件:Objects/listobject.c

        +
        // listobject.c
        +
        +int
        +PyList_SetItem(PyObject *op, Py_ssize_t i,
        +               PyObject *newitem)
        +{
        +    PyObject **p;
        +    if (!PyList_Check(op)) {
        +        Py_XDECREF(newitem);
        +        PyErr_BadInternalCall();
        +        return -1;
        +    }
        +    if (i < 0 || i >= Py_SIZE(op)) {
        +        Py_XDECREF(newitem);
        +        PyErr_SetString(PyExc_IndexError,
        +                        "list assignment index out of range");
        +        return -1;
        +    }
        +    p = ((PyListObject *)op) -> ob_item + i;
        +    Py_XSETREF(*p, newitem);
        +    return 0;
        +}
        +
        +

        元素赋值的示例

        +
        lst = [0, 1, 2]
        +lst[0] = 3
        +# 这里 lst[0] = 3 会调用 PyList_SetItem 函数
        +
        +

        PyList_GetItem 获取元素

        +

        源文件:Objects/listobject.c

        +
        // Objects/listobject.c
        +
        +PyObject *
        +PyList_GetItem(PyObject *op, Py_ssize_t i)
        +{
        +    if (!PyList_Check(op)) {
        +        PyErr_BadInternalCall();
        +        return NULL;
        +    }
        +    if (i < 0 || i >= Py_SIZE(op)) {
        +        if (indexerr == NULL) {
        +            indexerr = PyUnicode_FromString(
        +                "list index out of range");
        +            if (indexerr == NULL)
        +                return NULL;
        +        }
        +        PyErr_SetObject(PyExc_IndexError, indexerr);
        +        return NULL;
        +    }
        +    return ((PyListObject *)op) -> ob_item[i];
        +}
        +
        +

        获取元素的示例

        +
        lst = [1, 2, 3, 4]
        +print(lst[3])
        +# lst[3] 实际调用的就是 PyList_GetItem
        +# 根据索引返回对应的元素
        +
        +

        PyList_Append 追加元素

        +

        PyList_Append 调用 app1

        +
        int
        +PyList_Append(PyObject *op, PyObject *newitem)
        +{
        +    if (PyList_Check(op) && (newitem != NULL))
        +        return app1((PyListObject *)op, newitem);
        +    PyErr_BadInternalCall();
        +    return -1;
        +}
        +
        +

        源文件:Objects/listobject.c

        +
        // Objects/listobject.c
        +
        +static int
        +app1(PyListObject *self, PyObject *v)
        +{
        +    Py_ssize_t n = PyList_GET_SIZE(self);
        +
        +    assert (v != NULL);
        +    if (n == PY_SSIZE_T_MAX) {
        +        PyErr_SetString(PyExc_OverflowError,
        +            "cannot add more objects to list");
        +        return -1;
        +    }
        +
        +    if (list_resize(self, n+1) < 0)
        +        return -1;
        +
        +    Py_INCREF(v);
        +    PyList_SET_ITEM(self, n, v);
        +    return 0;
        +}
        +
        +

        app1代码可以看出追加元素操作大致流程如下

        +
          +
        • 调用list_resize,将list大小加一
        • +
        • 将元素插入list尾部
        • +
        +

        PyList_Insert 插入元素

        +

        PyList_Insert 调用 ins1

        +
        int
        +PyList_Insert(PyObject *op, Py_ssize_t where, PyObject *newitem)
        +{
        +    if (!PyList_Check(op)) {
        +        PyErr_BadInternalCall();
        +        return -1;
        +    }
        +    return ins1((PyListObject *)op, where, newitem);
        +}
        +
        +

        源文件:Objects/listobject.c

        +
        // Objects/listobject.c
        +
        +static int
        +ins1(PyListObject *self, Py_ssize_t where, PyObject *v)
        +{
        +    Py_ssize_t i, n = Py_SIZE(self);
        +    PyObject **items;
        +    if (v == NULL) {
        +        PyErr_BadInternalCall();
        +        return -1;
        +    }
        +    if (n == PY_SSIZE_T_MAX) {
        +        PyErr_SetString(PyExc_OverflowError,
        +            "cannot add more objects to list");
        +        return -1;
        +    }
        +
        +    if (list_resize(self, n+1) < 0)
        +        return -1;
        +
        +    if (where < 0) {
        +        where += n;
        +        if (where < 0)
        +            where = 0;
        +    }
        +    if (where > n)
        +        where = n;
        +    items = self->ob_item;
        +    for (i = n; --i >= where; )
        +        items[i+1] = items[i];
        +    Py_INCREF(v);
        +    items[where] = v;
        +    return 0;
        +}
        +
        +

        ins1代码可以看出插入元素操作大致流程如下

        +
          +
        • 调用list_resize,将list大小加一
        • +
        • 将要插入的位置的元素都往后移一个位置
        • +
        • 将元素插入指定位置
        • +
        +

        list_remove 移除元素

        +

        源文件:Objects/listobject.c

        +
        // listobject.c
        +
        +static PyObject *
        +list_remove(PyListObject *self, PyObject *value)
        +/*[clinic end generated code: output=f087e1951a5e30d1 input=2dc2ba5bb2fb1f82]*/
        +{
        +    Py_ssize_t i;
        +
        +    for (i = 0; i < Py_SIZE(self); i++) {
        +        int cmp = PyObject_RichCompareBool(self->ob_item[i], value, Py_EQ);
        +        if (cmp > 0) {
        +            if (list_ass_slice(self, i, i+1,
        +                               (PyObject *)NULL) == 0)
        +                Py_RETURN_NONE;
        +            return NULL;
        +        }
        +        else if (cmp < 0)
        +            return NULL;
        +    }
        +    PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
        +    return NULL;
        +}
        +
        +

        移除元素示例

        +
        lst = [0, 2, 4, 3]
        +lst.remove(3)
        +"""
        +lst.remove(3) 会调用 list_remove函数,
        +list_remove函数会遍历列表,使用PyObject_RichCompareBool与目标值进行比较,
        +相同则调用list_ass_slice进行移除,当遍历完列表还未找到则报错
        +"""
        +
        +

        list_resize 调整list存储空间

        +

        随着list元素的增加,list的存储空间可能会不够用,这个时候就需要扩大list的存储空间。 +随着list元素的减少,list的存储空间可能存在冗余,这个时候就需要缩小list的存储空间。 +函数list_resize就是用于调节list存储空间大小的

        +

        源文件:Objects/listobject.c

        +
        // listobject.c
        +
        +static int
        +list_resize(PyListObject *self, Py_ssize_t newsize)
        +{
        +    PyObject **items;
        +    size_t new_allocated, num_allocated_bytes;
        +    Py_ssize_t allocated = self->allocated;
        +
        +    /* Bypass realloc() when a previous overallocation is large enough
        +       to accommodate the newsize.  If the newsize falls lower than half
        +       the allocated size, then proceed with the realloc() to shrink the list.
        +    */
        +    if (allocated >= newsize && newsize >= (allocated >> 1)) {
        +        assert(self->ob_item != NULL || newsize == 0);
        +        Py_SIZE(self) = newsize;
        +        return 0;
        +    }
        +
        +    /* This over-allocates proportional to the list size, making room
        +     * for additional growth.  The over-allocation is mild, but is
        +     * enough to give linear-time amortized behavior over a long
        +     * sequence of appends() in the presence of a poorly-performing
        +     * system realloc().
        +     * The growth pattern is:  0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ...
        +     * Note: new_allocated won't overflow because the largest possible value
        +     *       is PY_SSIZE_T_MAX * (9 / 8) + 6 which always fits in a size_t.
        +     */
        +    new_allocated = (size_t)newsize + (newsize >> 3) + (newsize < 9 ? 3 : 6);
        +    if (new_allocated > (size_t)PY_SSIZE_T_MAX / sizeof(PyObject *)) {
        +        PyErr_NoMemory();
        +        return -1;
        +    }
        +
        +    if (newsize == 0)
        +        new_allocated = 0;
        +    num_allocated_bytes = new_allocated * sizeof(PyObject *);
        +    items = (PyObject **)PyMem_Realloc(self->ob_item, num_allocated_bytes);
        +    if (items == NULL) {
        +        PyErr_NoMemory();
        +        return -1;
        +    }
        +    self->ob_item = items;
        +    Py_SIZE(self) = newsize;
        +    self->allocated = new_allocated;
        +    return 0;
        +}
        +
        +

        allocated/2 <= newsize <= allocated 时,list_resize只会改变 ob_size不会改变allocated。 +其他情况则需要调用PyMem_Realloc函数分配新的空间存储列表元素。

        +

        列表allocated的增长模式是 0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ...

        +

        其公式为 new_allocated = (size_t)newsize + (newsize >> 3) + (newsize < 9 ? 3 : 6)

        +
        Copyright © FlagGo 2019 all right reserved,powered by Gitbook该文件修订时间: +2020-03-23 19:36:27 +
        + +
        + +
        +
        +
        + +

        results matching ""

        +
          + +
          +
          + +

          No results matching ""

          + +
          +
          +
          + +
          +
          + +
          + + + + + + + + + + + + + + +
          + + +
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/objects/list-object/index.md b/objects/list-object/index.md deleted file mode 100644 index 76b6fb2..0000000 --- a/objects/list-object/index.md +++ /dev/null @@ -1,414 +0,0 @@ -# Python List 对象 - -在Python中的list可以存放任何类型的数据,查看`PyListObject`可以发现,list实际存放的是PyObject* 指针 - -## PyListObject - -`源文件:`[Include/listobject.h](https://github.com/python/cpython/blob/v3.7.0/Include/listobject.h#L23) - -```c -// listobject.h - -typedef struct { - PyObject_VAR_HEAD - /* Vector of pointers to list elements. list[0] is ob_item[0], etc. */ - PyObject **ob_item; - - /* ob_item contains space for 'allocated' elements. The number - * currently in use is ob_size. - * Invariants: - * 0 <= ob_size <= allocated - * len(list) == ob_size - * ob_item == NULL implies ob_size == allocated == 0 - * list.sort() temporarily sets allocated to -1 to detect mutations. - * - * Items must normally not be NULL, except during construction when - * the list is not yet visible outside the function that builds it. - */ - - // 可容纳元素的总数 - Py_ssize_t allocated; -} PyListObject; -``` - -示例 -```python -lst = [] -lst.append(1) -``` - -其存储结构如下图 - -![PyList structure](PyListStructure.png) - - - -## PyListObject对象的一些操作 - -- 创建PyListObject PyList_New -- 对象赋值 PyList_SetItem -- 获取元素 PyList_GetItem -- 插入元素 PyList_Insert -- 追加元素 PyList_Append -- 移除元素 list_remove -- 调整list大小 list_resize - -### PyList_New 创建对象 - -为了避免频繁的申请内存空间,创建PyListObject的时候会先检查缓冲池是否有可用空间 - -`源文件:`[Objects/listobject.c](https://github.com/python/cpython/blob/v3.7.0/Objects/listobject.c#L136) - -```c -// listobject.c - -PyObject * -PyList_New(Py_ssize_t size) -{ - PyListObject *op; -#ifdef SHOW_ALLOC_COUNT - static int initialized = 0; - if (!initialized) { - Py_AtExit(show_alloc); - initialized = 1; - } -#endif - - // size 合法性检查 - if (size < 0) { - PyErr_BadInternalCall(); - return NULL; - } - - // PyListObject对象缓冲池是否有可用空间 - if (numfree) { - numfree--; - op = free_list[numfree]; - _Py_NewReference((PyObject *)op); -#ifdef SHOW_ALLOC_COUNT - count_reuse++; -#endif - } else { - // 缓冲池满只能向系统申请内存 - op = PyObject_GC_New(PyListObject, &PyList_Type); - if (op == NULL) - return NULL; -#ifdef SHOW_ALLOC_COUNT - count_alloc++; -#endif - } - if (size <= 0) - op->ob_item = NULL; - else { - op->ob_item = (PyObject **) PyMem_Calloc(size, sizeof(PyObject *)); - if (op->ob_item == NULL) { - Py_DECREF(op); - return PyErr_NoMemory(); - } - } - Py_SIZE(op) = size; - op->allocated = size; - _PyObject_GC_TRACK(op); - return (PyObject *) op; -} -``` - -PyListObject缓冲池默认大小为80 `源文件:`[Include/listobject.c](https://github.com/python/cpython/blob/v3.7.0/Objects/listobject.c#L101) - -```c -// listobject.c - -/* Empty list reuse scheme to save calls to malloc and free */ -#ifndef PyList_MAXFREELIST -#define PyList_MAXFREELIST 80 -#endif -static PyListObject *free_list[PyList_MAXFREELIST]; -static int numfree = 0; -``` - -### PyList_SetItem 元素赋值 - -`源文件:`[Objects/listobject.c](https://github.com/python/cpython/blob/v3.7.0/Objects/listobject.c#L215) - -```c -// listobject.c - -int -PyList_SetItem(PyObject *op, Py_ssize_t i, - PyObject *newitem) -{ - PyObject **p; - if (!PyList_Check(op)) { - Py_XDECREF(newitem); - PyErr_BadInternalCall(); - return -1; - } - if (i < 0 || i >= Py_SIZE(op)) { - Py_XDECREF(newitem); - PyErr_SetString(PyExc_IndexError, - "list assignment index out of range"); - return -1; - } - p = ((PyListObject *)op) -> ob_item + i; - Py_XSETREF(*p, newitem); - return 0; -} -``` - -元素赋值的示例 - -```python -lst = [0, 1, 2] -lst[0] = 3 -# 这里 lst[0] = 3 会调用 PyList_SetItem 函数 -``` - - -### PyList_GetItem 获取元素 - -`源文件:`[Objects/listobject.c](https://github.com/python/cpython/blob/v3.7.0/Objects/listobject.c#L195) - -```c -// Objects/listobject.c - -PyObject * -PyList_GetItem(PyObject *op, Py_ssize_t i) -{ - if (!PyList_Check(op)) { - PyErr_BadInternalCall(); - return NULL; - } - if (i < 0 || i >= Py_SIZE(op)) { - if (indexerr == NULL) { - indexerr = PyUnicode_FromString( - "list index out of range"); - if (indexerr == NULL) - return NULL; - } - PyErr_SetObject(PyExc_IndexError, indexerr); - return NULL; - } - return ((PyListObject *)op) -> ob_item[i]; -} -``` - -获取元素的示例 - -```python -lst = [1, 2, 3, 4] -print(lst[3]) -# lst[3] 实际调用的就是 PyList_GetItem -# 根据索引返回对应的元素 -``` - - -### PyList_Append 追加元素 - -PyList_Append 调用 app1 - -```c -int -PyList_Append(PyObject *op, PyObject *newitem) -{ - if (PyList_Check(op) && (newitem != NULL)) - return app1((PyListObject *)op, newitem); - PyErr_BadInternalCall(); - return -1; -} -``` - -`源文件:`[Objects/listobject.c](https://github.com/python/cpython/blob/v3.7.0/Objects/listobject.c#L279) - -```c -// Objects/listobject.c - -static int -app1(PyListObject *self, PyObject *v) -{ - Py_ssize_t n = PyList_GET_SIZE(self); - - assert (v != NULL); - if (n == PY_SSIZE_T_MAX) { - PyErr_SetString(PyExc_OverflowError, - "cannot add more objects to list"); - return -1; - } - - if (list_resize(self, n+1) < 0) - return -1; - - Py_INCREF(v); - PyList_SET_ITEM(self, n, v); - return 0; -} -``` - -从`app1`代码可以看出追加元素操作大致流程如下 -- 调用list_resize,将list大小加一 -- 将元素插入list尾部 - -### PyList_Insert 插入元素 - -PyList_Insert 调用 ins1 - -```c -int -PyList_Insert(PyObject *op, Py_ssize_t where, PyObject *newitem) -{ - if (!PyList_Check(op)) { - PyErr_BadInternalCall(); - return -1; - } - return ins1((PyListObject *)op, where, newitem); -} -``` - -`源文件:`[Objects/listobject.c](https://github.com/python/cpython/blob/v3.7.0/Objects/listobject.c#L236) - -```c -// Objects/listobject.c - -static int -ins1(PyListObject *self, Py_ssize_t where, PyObject *v) -{ - Py_ssize_t i, n = Py_SIZE(self); - PyObject **items; - if (v == NULL) { - PyErr_BadInternalCall(); - return -1; - } - if (n == PY_SSIZE_T_MAX) { - PyErr_SetString(PyExc_OverflowError, - "cannot add more objects to list"); - return -1; - } - - if (list_resize(self, n+1) < 0) - return -1; - - if (where < 0) { - where += n; - if (where < 0) - where = 0; - } - if (where > n) - where = n; - items = self->ob_item; - for (i = n; --i >= where; ) - items[i+1] = items[i]; - Py_INCREF(v); - items[where] = v; - return 0; -} -``` - -从`ins1`代码可以看出插入元素操作大致流程如下 -- 调用list_resize,将list大小加一 -- 将要插入的位置的元素都往后移一个位置 -- 将元素插入指定位置 - -### list_remove 移除元素 - -`源文件:`[Objects/listobject.c](https://github.com/python/cpython/blob/v3.7.0/Objects/listobject.c#L2546) - -```c -// listobject.c - -static PyObject * -list_remove(PyListObject *self, PyObject *value) -/*[clinic end generated code: output=f087e1951a5e30d1 input=2dc2ba5bb2fb1f82]*/ -{ - Py_ssize_t i; - - for (i = 0; i < Py_SIZE(self); i++) { - int cmp = PyObject_RichCompareBool(self->ob_item[i], value, Py_EQ); - if (cmp > 0) { - if (list_ass_slice(self, i, i+1, - (PyObject *)NULL) == 0) - Py_RETURN_NONE; - return NULL; - } - else if (cmp < 0) - return NULL; - } - PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list"); - return NULL; -} -``` - -移除元素示例 - -```python -lst = [0, 2, 4, 3] -lst.remove(3) -""" -lst.remove(3) 会调用 list_remove函数, -list_remove函数会遍历列表,使用PyObject_RichCompareBool与目标值进行比较, -相同则调用list_ass_slice进行移除,当遍历完列表还未找到则报错 -""" -``` - -### list_resize 调整list存储空间 - -随着list元素的增加,list的存储空间可能会不够用,这个时候就需要扩大list的存储空间。 -随着list元素的减少,list的存储空间可能存在冗余,这个时候就需要缩小list的存储空间。 -函数`list_resize`就是用于调节list存储空间大小的 - -`源文件:`[Objects/listobject.c](https://github.com/python/cpython/blob/v3.7.0/Objects/listobject.c#L19) - -```c -// listobject.c - -static int -list_resize(PyListObject *self, Py_ssize_t newsize) -{ - PyObject **items; - size_t new_allocated, num_allocated_bytes; - Py_ssize_t allocated = self->allocated; - - /* Bypass realloc() when a previous overallocation is large enough - to accommodate the newsize. If the newsize falls lower than half - the allocated size, then proceed with the realloc() to shrink the list. - */ - if (allocated >= newsize && newsize >= (allocated >> 1)) { - assert(self->ob_item != NULL || newsize == 0); - Py_SIZE(self) = newsize; - return 0; - } - - /* This over-allocates proportional to the list size, making room - * for additional growth. The over-allocation is mild, but is - * enough to give linear-time amortized behavior over a long - * sequence of appends() in the presence of a poorly-performing - * system realloc(). - * The growth pattern is: 0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ... - * Note: new_allocated won't overflow because the largest possible value - * is PY_SSIZE_T_MAX * (9 / 8) + 6 which always fits in a size_t. - */ - new_allocated = (size_t)newsize + (newsize >> 3) + (newsize < 9 ? 3 : 6); - if (new_allocated > (size_t)PY_SSIZE_T_MAX / sizeof(PyObject *)) { - PyErr_NoMemory(); - return -1; - } - - if (newsize == 0) - new_allocated = 0; - num_allocated_bytes = new_allocated * sizeof(PyObject *); - items = (PyObject **)PyMem_Realloc(self->ob_item, num_allocated_bytes); - if (items == NULL) { - PyErr_NoMemory(); - return -1; - } - self->ob_item = items; - Py_SIZE(self) = newsize; - self->allocated = new_allocated; - return 0; -} -``` - -当 `allocated/2 <= newsize <= allocated` 时,list_resize只会改变 ob_size不会改变allocated。 -其他情况则需要调用`PyMem_Realloc`函数分配新的空间存储列表元素。 - -列表allocated的增长模式是 0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ... - -其公式为 `new_allocated = (size_t)newsize + (newsize >> 3) + (newsize < 9 ? 3 : 6)` diff --git a/objects/long-object/index.html b/objects/long-object/index.html new file mode 100644 index 0000000..3bc399a --- /dev/null +++ b/objects/long-object/index.html @@ -0,0 +1,1043 @@ + + + + + + + Python 整数对象 · Python 3 源码分析 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          +
          + + + + + + + + +
          + +
          + +
          + + + + + + + + +
          +
          + +
          +
          + +
          + +

          Python 整数对象

          +

          CPython2 的整数对象 有 PyIntObjectPyLongObject 这两种类型, +CPython3 只保留了 PyLongObject

          +

          源文件:Objects/longobject.c +的第三行有这么一句话 XXX The functional organization of this file is terrible

          +

          可见这个变化不是一蹴而就的,有比较艰辛的过程,大家有兴趣可以去挖掘一下

          +

          PyLongObject

          +

          源文件:Include/longobject.h

          +
          // longobject.h
          +
          +typedef struct _longobject PyLongObject; /* Revealed in longintrepr.h */
          +
          +

          源文件:Include/longintrepr.h

          +
          // longintrepr.h
          +/* Long integer representation.
          +   The absolute value of a number is equal to
          +   一个数的绝对值等价于下面的表达式
          +        SUM(for i=0 through abs(ob_size)-1) ob_digit[i] * 2**(SHIFT*i)
          +
          +   Negative numbers are represented with ob_size < 0;
          +   负数表示为 ob_size < 0
          +
          +   zero is represented by ob_size == 0.
          +   整数0 用 ob_size == 0表示
          +
          +   In a normalized number, ob_digit[abs(ob_size)-1] (the most significant
          +   digit) is never zero.  Also, in all cases, for all valid i,
          +
          +    在一个规范的数字ob_digit[abs(ob_size)-1]()永不为0。而且,所有有效的 i 都满足以下要求
          +        0 <= ob_digit[i] <= MASK.
          +
          +   The allocation function takes care of allocating extra memory
          +   so that ob_digit[0] ... ob_digit[abs(ob_size)-1] are actually available.
          +
          +   CAUTION:  Generic code manipulating subtypes of PyVarObject has to
          +   aware that ints abuse ob_size's sign bit.
          +
          +   警告: 通用代码操作 PyVarObject 的子类型必须注意 ob_size的符号滥用问题。
          +*/
          +
          +struct _longobject {
          +    PyObject_VAR_HEAD
          +    digit ob_digit[1];
          +};
          +
          +

          从源码可以看出 PyLongObject 是变长对象

          +

          类型对象 PyLong_Type

          +

          源文件:Objects/longobject.c

          +
          // Objects/longobject.c
          +
          +PyTypeObject PyLong_Type = {
          +    PyVarObject_HEAD_INIT(&PyType_Type, 0)
          +    "int",                                      /* tp_name */
          +    offsetof(PyLongObject, ob_digit),           /* tp_basicsize */
          +    sizeof(digit),                              /* tp_itemsize */
          +    long_dealloc,                               /* tp_dealloc */
          +    0,                                          /* tp_print */
          +    0,                                          /* tp_getattr */
          +    0,                                          /* tp_setattr */
          +    0,                                          /* tp_reserved */
          +    long_to_decimal_string,                     /* tp_repr */
          +    &long_as_number,                            /* tp_as_number */
          +    0,                                          /* tp_as_sequence */
          +    0,                                          /* tp_as_mapping */
          +    (hashfunc)long_hash,                        /* tp_hash */
          +    0,                                          /* tp_call */
          +    long_to_decimal_string,                     /* tp_str */
          +    PyObject_GenericGetAttr,                    /* tp_getattro */
          +    0,                                          /* tp_setattro */
          +    0,                                          /* tp_as_buffer */
          +    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
          +        Py_TPFLAGS_LONG_SUBCLASS,               /* tp_flags */
          +    long_doc,                                   /* tp_doc */
          +    0,                                          /* tp_traverse */
          +    0,                                          /* tp_clear */
          +    long_richcompare,                           /* tp_richcompare */
          +    0,                                          /* tp_weaklistoffset */
          +    0,                                          /* tp_iter */
          +    0,                                          /* tp_iternext */
          +    long_methods,                               /* tp_methods */
          +    0,                                          /* tp_members */
          +    long_getset,                                /* tp_getset */
          +    0,                                          /* tp_base */
          +    0,                                          /* tp_dict */
          +    0,                                          /* tp_descr_get */
          +    0,                                          /* tp_descr_set */
          +    0,                                          /* tp_dictoffset */
          +    0,                                          /* tp_init */
          +    0,                                          /* tp_alloc */
          +    long_new,                                   /* tp_new */
          +    PyObject_Del,                               /* tp_free */
          +};
          +
          +

          创建整数对象

          +

          从 PyLong_Type 可以看出,创建一个整数对象的入口函数为 long_new

          +

          源文件:Objects/clinic/longobject.c.h

          +
          // Objects/clinic/longobject.c.h
          +/*[clinic input]
          +preserve
          +[clinic start generated code]*/
          +
          +static PyObject *
          +long_new_impl(PyTypeObject *type, PyObject *x, PyObject *obase);
          +
          +static PyObject *
          +long_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
          +{
          +    PyObject *return_value = NULL;
          +    static const char * const _keywords[] = {"", "base", NULL};
          +    static _PyArg_Parser _parser = {"|OO:int", _keywords, 0};
          +    PyObject *x = NULL;
          +    PyObject *obase = NULL;
          +
          +    if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser,
          +        &x, &obase)) {
          +        goto exit;
          +    }
          +    return_value = long_new_impl(type, x, obase);
          +
          +exit:
          +    return return_value;
          +}
          +
          +

          具体实现在 long_new_impl 源文件:Objects/longobject.c

          +
          // Objects/longobject.c
          +
          +/*[clinic input]
          +@classmethod
          +int.__new__ as long_new
          +    x: object(c_default="NULL") = 0
          +    /
          +    base as obase: object(c_default="NULL") = 10
          +[clinic start generated code]*/
          +
          +static PyObject *
          +long_new_impl(PyTypeObject *type, PyObject *x, PyObject *obase)
          +/*[clinic end generated code: output=e47cfe777ab0f24c input=81c98f418af9eb6f]*/
          +{
          +    Py_ssize_t base;
          +
          +    if (type != &PyLong_Type)
          +        return long_subtype_new(type, x, obase); /* Wimp out */
          +    if (x == NULL) {
          +        if (obase != NULL) {
          +            PyErr_SetString(PyExc_TypeError,
          +                            "int() missing string argument");
          +            return NULL;
          +        }
          +        return PyLong_FromLong(0L);
          +    }
          +    if (obase == NULL)
          +        return PyNumber_Long(x);
          +
          +    base = PyNumber_AsSsize_t(obase, NULL);
          +    if (base == -1 && PyErr_Occurred())
          +        return NULL;
          +    if ((base != 0 && base < 2) || base > 36) {
          +        PyErr_SetString(PyExc_ValueError,
          +                        "int() base must be >= 2 and <= 36, or 0");
          +        return NULL;
          +    }
          +
          +    if (PyUnicode_Check(x))
          +        return PyLong_FromUnicodeObject(x, (int)base);
          +    else if (PyByteArray_Check(x) || PyBytes_Check(x)) {
          +        char *string;
          +        if (PyByteArray_Check(x))
          +            string = PyByteArray_AS_STRING(x);
          +        else
          +            string = PyBytes_AS_STRING(x);
          +        return _PyLong_FromBytes(string, Py_SIZE(x), (int)base);
          +    }
          +    else {
          +        PyErr_SetString(PyExc_TypeError,
          +                        "int() can't convert non-string with explicit base");
          +        return NULL;
          +    }
          +}
          +
          +

          从 long_new_impl 函数可以看出有如下几种情况

          +
            +
          • x == NULL 且 obase != NULL 调用 PyLong_FromLong
          • +
          • obase 为 NULL 调用 PyNumber_Long
          • +
          • x 和 obase 都不为 NULL
              +
            • PyUnicode 调用 PyLong_FromUnicodeObject,最终调用 PyLong_FromString
            • +
            • PyByteArray/PyBytes 调用_PyLong_FromBytes,最终调用 PyLong_FromString
            • +
            +
          • +
          +

          小整数对象

          +

          一些整数在一开始就会被初始化一直留存,当再次使用直接从小整数对象池中获取,不用频繁的申请内存。

          +

          默认的小整数范围是 [-5, 257) 源文件:Objects/longobject.c

          +
          // Objects/longobject.c
          +
          +#ifndef NSMALLPOSINTS
          +#define NSMALLPOSINTS           257
          +#endif
          +#ifndef NSMALLNEGINTS
          +#define NSMALLNEGINTS           5
          +#endif
          +
          +#if NSMALLNEGINTS + NSMALLPOSINTS > 0
          +/* Small integers are preallocated in this array so that they
          +   can be shared.
          +   The integers that are preallocated are those in the range
          +   -NSMALLNEGINTS (inclusive) to NSMALLPOSINTS (not inclusive). */
          +static PyLongObject small_ints[NSMALLNEGINTS + NSMALLPOSINTS];
          +#ifdef COUNT_ALLOCS
          +Py_ssize_t quick_int_allocs, quick_neg_int_allocs;
          +#endif
          +
          +static PyObject *
          +get_small_int(sdigit ival)
          +{
          +    PyObject *v;
          +    assert(-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS);
          +    v = (PyObject *)&small_ints[ival + NSMALLNEGINTS];
          +    Py_INCREF(v);
          +#ifdef COUNT_ALLOCS
          +    if (ival >= 0)
          +        quick_int_allocs++;
          +    else
          +        quick_neg_int_allocs++;
          +#endif
          +    return v;
          +}
          +#define CHECK_SMALL_INT(ival) \
          +    do if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) { \
          +        return get_small_int((sdigit)ival); \
          +    } while(0)
          +
          +

          CHECK_SMALL_INT 会检查传入的数是否在小整数范围内,如果是直接返回。 +可以在创建或复制整数对象等函数中找到 CHECK_SMALL_INT 的身影,以下只列出了 +PyLong_FromLong,就不一一列举了

          +

          源文件:Objects/longobject.c

          +
          // Object/longobject.c
          +
          +PyObject *
          +PyLong_FromLong(long ival)
          +{
          +    PyLongObject *v;
          +    unsigned long abs_ival;
          +    unsigned long t;  /* unsigned so >> doesn't propagate sign bit */
          +    int ndigits = 0;
          +    int sign;
          +
          +    CHECK_SMALL_INT(ival);
          +
          +    ...
          +}
          +
          +

          小整数初始化

          +

          源文件:Objects/longobject.c

          +
          // Objects/longobject.c
          +
          +int
          +_PyLong_Init(void)
          +{
          +#if NSMALLNEGINTS + NSMALLPOSINTS > 0
          +    int ival, size;
          +    PyLongObject *v = small_ints;
          +
          +    for (ival = -NSMALLNEGINTS; ival <  NSMALLPOSINTS; ival++, v++) {
          +        size = (ival < 0) ? -1 : ((ival == 0) ? 0 : 1);
          +        if (Py_TYPE(v) == &PyLong_Type) {
          +            /* The element is already initialized, most likely
          +             * the Python interpreter was initialized before.
          +             */
          +            Py_ssize_t refcnt;
          +            PyObject* op = (PyObject*)v;
          +
          +            refcnt = Py_REFCNT(op) < 0 ? 0 : Py_REFCNT(op);
          +            _Py_NewReference(op);
          +            /* _Py_NewReference sets the ref count to 1 but
          +             * the ref count might be larger. Set the refcnt
          +             * to the original refcnt + 1 */
          +            Py_REFCNT(op) = refcnt + 1;
          +            assert(Py_SIZE(op) == size);
          +            assert(v->ob_digit[0] == (digit)abs(ival));
          +        }
          +        else {
          +            (void)PyObject_INIT(v, &PyLong_Type);
          +        }
          +        Py_SIZE(v) = size;
          +        v->ob_digit[0] = (digit)abs(ival);
          +    }
          +#endif
          +    _PyLong_Zero = PyLong_FromLong(0);
          +    if (_PyLong_Zero == NULL)
          +        return 0;
          +    _PyLong_One = PyLong_FromLong(1);
          +    if (_PyLong_One == NULL)
          +        return 0;
          +
          +    /* initialize int_info */
          +    if (Int_InfoType.tp_name == NULL) {
          +        if (PyStructSequence_InitType2(&Int_InfoType, &int_info_desc) < 0)
          +            return 0;
          +    }
          +
          +    return 1;
          +}
          +
          +

          整数的存储结构

          +

          源文件:Objects/longobject.c

          +

          long_to_decimal_string_internal中添加如下代码并重新编译安装

          +
          // Objects/longobject.c
          +static int
          +long_to_decimal_string_internal(PyObject *aa,
          +                                PyObject **p_output,
          +                                _PyUnicodeWriter *writer,
          +                                _PyBytesWriter *bytes_writer,
          +                                char **bytes_str)
          +{
          +    PyLongObject *scratch, *a;
          +    PyObject *str = NULL;
          +    Py_ssize_t size, strlen, size_a, i, j;
          +    digit *pout, *pin, rem, tenpow;
          +    int negative;
          +    int d;
          +    enum PyUnicode_Kind kind;
          +
          +    a = (PyLongObject *)aa;
          +
          +    // 添加打印代码
          +    printf("ob_size     = %d\n", Py_SIZE(a));
          +    for (int index = 0; index < Py_SIZE(a); ++index) {
          +        printf("ob_digit[%d] = %d\n", index, a->ob_digit[index]);
          +    }
          +
          +    ...
          +}
          +
          +

          编译安装后进入 python 解释器输入如下代码

          +
          num = 9223372043297226753
          +print(num)
          +
          +# output
          +>>> ob_size     = 3
          +>>> ob_digit[0] = 1
          +>>> ob_digit[1] = 6
          +>>> ob_digit[2] = 8
          +>>> 9223372043297226753
          +
          +

          如下图所示

          +

          longobject storage

          +

          注:这里的 30 是由 PyLong_SHIFT 决定的,64 位系统中,PyLong_SHIFT 为 30,否则 PyLong_SHIFT 为 15

          +

          整数对象的数值操作

          +

          可以看到整数对象的数值操作较多,由于篇幅限制无法一一分析,这里只分析整数的部分操作

          +

          源文件:Objects/longobject.c

          +
          // Objects/longobject.c
          +
          +static PyNumberMethods long_as_number = {
          +    (binaryfunc)long_add,       /*nb_add   加法 */
          +    (binaryfunc)long_sub,       /*nb_subtract  减法 */
          +    (binaryfunc)long_mul,       /*nb_multiply    乘法 */
          +    long_mod,                   /*nb_remainder 取余 */
          +    long_divmod,                /*nb_divmod */
          +    long_pow,                   /*nb_power 求幂 */
          +    (unaryfunc)long_neg,        /*nb_negative */
          +    (unaryfunc)long_long,       /*tp_positive */
          +    (unaryfunc)long_abs,        /*tp_absolute 绝对值 */
          +    (inquiry)long_bool,         /*tp_bool 求bool值 */
          +    (unaryfunc)long_invert,     /*nb_invert 反转 */
          +    long_lshift,                /*nb_lshift 逻辑左移 */
          +    (binaryfunc)long_rshift,    /*nb_rshift 逻辑右移 */
          +    long_and,                   /*nb_and 与操作 */
          +    long_xor,                   /*nb_xor 异或 */
          +    long_or,                    /*nb_or 或操作 */
          +    long_long,                  /*nb_int*/
          +    0,                          /*nb_reserved*/
          +    long_float,                 /*nb_float*/
          +    0,                          /* nb_inplace_add */
          +    0,                          /* nb_inplace_subtract */
          +    0,                          /* nb_inplace_multiply */
          +    0,                          /* nb_inplace_remainder */
          +    0,                          /* nb_inplace_power */
          +    0,                          /* nb_inplace_lshift */
          +    0,                          /* nb_inplace_rshift */
          +    0,                          /* nb_inplace_and */
          +    0,                          /* nb_inplace_xor */
          +    0,                          /* nb_inplace_or */
          +    long_div,                   /* nb_floor_divide */
          +    long_true_divide,           /* nb_true_divide */
          +    0,                          /* nb_inplace_floor_divide */
          +    0,                          /* nb_inplace_true_divide */
          +    long_long,                  /* nb_index */
          +};
          +
          +

          整数相加

          +

          源文件:Objects/longobject.c

          +
          // Objects/longobject.c
          +
          +static PyObject *
          +long_add(PyLongObject *a, PyLongObject *b)
          +{
          +    PyLongObject *z;
          +
          +    CHECK_BINOP(a, b);
          +
          +    if (Py_ABS(Py_SIZE(a)) <= 1 && Py_ABS(Py_SIZE(b)) <= 1) {
          +        return PyLong_FromLong(MEDIUM_VALUE(a) + MEDIUM_VALUE(b));
          +    }
          +    if (Py_SIZE(a) < 0) {
          +        if (Py_SIZE(b) < 0) {
          +            z = x_add(a, b);
          +            if (z != NULL) {
          +                /* x_add received at least one multiple-digit int,
          +                   and thus z must be a multiple-digit int.
          +                   That also means z is not an element of
          +                   small_ints, so negating it in-place is safe. */
          +                assert(Py_REFCNT(z) == 1);
          +                Py_SIZE(z) = -(Py_SIZE(z));
          +            }
          +        }
          +        else
          +            z = x_sub(b, a);
          +    }
          +    else {
          +        if (Py_SIZE(b) < 0)
          +            z = x_sub(a, b);
          +        else
          +            z = x_add(a, b);
          +    }
          +    return (PyObject *)z;
          +}
          +
          +

          可以看到整数的加法运算函数 long_add 根据 a、b 的 ob_size 又细分为两个函数 (x_add 和 x_sub) 做处理

          +

          源文件:Objects/longobject.c

          +
          // Objects/longobject.c
          +
          +/* Add the absolute values of two integers. */
          +static PyLongObject *
          +x_add(PyLongObject *a, PyLongObject *b)
          +{
          +    Py_ssize_t size_a = Py_ABS(Py_SIZE(a)), size_b = Py_ABS(Py_SIZE(b));
          +    PyLongObject *z;
          +    Py_ssize_t i;
          +    digit carry = 0;
          +
          +    /* Ensure a is the larger of the two: */
          +    // 确保 a 大于 b
          +    if (size_a < size_b) {
          +        { PyLongObject *temp = a; a = b; b = temp; }
          +        { Py_ssize_t size_temp = size_a;
          +            size_a = size_b;
          +            size_b = size_temp; }
          +    }
          +    z = _PyLong_New(size_a+1);
          +    if (z == NULL)
          +        return NULL;
          +    for (i = 0; i < size_b; ++i) {
          +        carry += a->ob_digit[i] + b->ob_digit[i];
          +        z->ob_digit[i] = carry & PyLong_MASK;
          +        carry >>= PyLong_SHIFT;
          +    }
          +    for (; i < size_a; ++i) {
          +        carry += a->ob_digit[i];
          +        z->ob_digit[i] = carry & PyLong_MASK;
          +        carry >>= PyLong_SHIFT;
          +    }
          +    z->ob_digit[i] = carry;
          +    return long_normalize(z);
          +}
          +
          +

          加法运算函数 x_add 从 ob_digit 数组的低位开始依次按位相加,carry 做进位处理,然后处理 a 对象的高位数字,最后使用 long_normalize 函数调整 ob_size,确保 ob_digit[abs(ob_size)-1]不为零,这与普通四则运算的加法运算相同,只不过进位单元不同而已

          +

          longobject x_add

          +

          源文件:Objects/longobject.c

          +
          // Objects/longobject.c
          +
          +/* Subtract the absolute values of two integers. */
          +
          +static PyLongObject *
          +x_sub(PyLongObject *a, PyLongObject *b)
          +{
          +    Py_ssize_t size_a = Py_ABS(Py_SIZE(a)), size_b = Py_ABS(Py_SIZE(b));
          +    PyLongObject *z;
          +    Py_ssize_t i;
          +    int sign = 1;
          +    digit borrow = 0;
          +
          +    /* Ensure a is the larger of the two: */
          +    // 确保 a 大于 b
          +    if (size_a < size_b) {
          +        sign = -1;
          +        { PyLongObject *temp = a; a = b; b = temp; }
          +        { Py_ssize_t size_temp = size_a;
          +            size_a = size_b;
          +            size_b = size_temp; }
          +    }
          +    else if (size_a == size_b) {
          +        /* Find highest digit where a and b differ: */
          +        // 找到最高位 a 与 b的差异
          +        i = size_a;
          +        while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
          +            ;
          +        if (i < 0)
          +            return (PyLongObject *)PyLong_FromLong(0);
          +        if (a->ob_digit[i] < b->ob_digit[i]) {
          +            sign = -1;
          +            { PyLongObject *temp = a; a = b; b = temp; }
          +        }
          +        size_a = size_b = i+1;
          +    }
          +    z = _PyLong_New(size_a);
          +    if (z == NULL)
          +        return NULL;
          +    for (i = 0; i < size_b; ++i) {
          +        /* The following assumes unsigned arithmetic
          +           works module 2**N for some N>PyLong_SHIFT. */
          +        borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
          +        z->ob_digit[i] = borrow & PyLong_MASK;
          +        borrow >>= PyLong_SHIFT;
          +        borrow &= 1; /* Keep only one sign bit */
          +    }
          +    for (; i < size_a; ++i) {
          +        borrow = a->ob_digit[i] - borrow;
          +        z->ob_digit[i] = borrow & PyLong_MASK;
          +        borrow >>= PyLong_SHIFT;
          +        borrow &= 1; /* Keep only one sign bit */
          +    }
          +    assert(borrow == 0);
          +    if (sign < 0) {
          +        Py_SIZE(z) = -Py_SIZE(z);
          +    }
          +    return long_normalize(z);
          +}
          +
          +

          与普通四则运算减法相同,数不够大则向高一位借位, +减法运算函数 x_sub 的示例图如下,注:PyLong_SHIFT 为 30

          +

          longobject x_sub

          +

          整数相乘

          +

          源文件:Objects/longobject.c

          +
          // Objects/longobject.c
          +static PyObject *
          +long_mul(PyLongObject *a, PyLongObject *b)
          +{
          +    PyLongObject *z;
          +
          +    CHECK_BINOP(a, b);
          +
          +    /* fast path for single-digit multiplication */
          +    if (Py_ABS(Py_SIZE(a)) <= 1 && Py_ABS(Py_SIZE(b)) <= 1) {
          +        stwodigits v = (stwodigits)(MEDIUM_VALUE(a)) * MEDIUM_VALUE(b);
          +        return PyLong_FromLongLong((long long)v);
          +    }
          +
          +    z = k_mul(a, b);
          +    /* Negate if exactly one of the inputs is negative. */
          +    if (((Py_SIZE(a) ^ Py_SIZE(b)) < 0) && z) {
          +        _PyLong_Negate(&z);
          +        if (z == NULL)
          +            return NULL;
          +    }
          +    return (PyObject *)z;
          +}
          +
          +

          k_mul 函数是一种快速乘法 源文件

          +
          +

          Karatsuba 的算法主要是用于两个大数的乘法,极大提高了运算效率,相较于普通乘法降低了复杂度,并在其中运用了递归的思想。 +基本的原理和做法是将位数很多的两个大数 x 和 y 分成位数较少的数,每个数都是原来 x 和 y 位数的一半。 +这样处理之后,简化为做三次乘法,并附带少量的加法操作和移位操作。

          +
          +

          具体可以看 wiki Karatsuba 算法的实现

          +
          Copyright © FlagGo 2019 all right reserved,powered by Gitbook该文件修订时间: +2020-03-23 19:36:27 +
          + +
          + +
          +
          +
          + +

          results matching ""

          +
            + +
            +
            + +

            No results matching ""

            + +
            +
            +
            + +
            +
            + +
            + + + + + + + + + + + + + + +
            + + +
            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/objects/long-object/index.md b/objects/long-object/index.md deleted file mode 100644 index 3d86586..0000000 --- a/objects/long-object/index.md +++ /dev/null @@ -1,634 +0,0 @@ -# Python 整数对象 - -CPython2 的整数对象 有 `PyIntObject` 和 `PyLongObject` 这两种类型, -CPython3 只保留了 `PyLongObject` - -在 `源文件:`[Objects/longobject.c](https://github.com/python/cpython/blob/v3.7.0/Objects/longobject.c#L3) -的第三行有这么一句话 `XXX The functional organization of this file is terrible` - -可见这个变化不是一蹴而就的,有比较艰辛的过程,大家有兴趣可以去挖掘一下 - -## PyLongObject - -`源文件:`[Include/longobject.h](https://github.com/python/cpython/blob/v3.7.0/Include/longobject.h#L10) - -```c -// longobject.h - -typedef struct _longobject PyLongObject; /* Revealed in longintrepr.h */ -``` - -`源文件:`[Include/longintrepr.h](https://github.com/python/cpython/blob/v3.7.0/Include/longintrepr.h#L85) - -```c -// longintrepr.h -/* Long integer representation. - The absolute value of a number is equal to - 一个数的绝对值等价于下面的表达式 - SUM(for i=0 through abs(ob_size)-1) ob_digit[i] * 2**(SHIFT*i) - - Negative numbers are represented with ob_size < 0; - 负数表示为 ob_size < 0 - - zero is represented by ob_size == 0. - 整数0 用 ob_size == 0表示 - - In a normalized number, ob_digit[abs(ob_size)-1] (the most significant - digit) is never zero. Also, in all cases, for all valid i, - - 在一个规范的数字ob_digit[abs(ob_size)-1]()永不为0。而且,所有有效的 i 都满足以下要求 - 0 <= ob_digit[i] <= MASK. - - The allocation function takes care of allocating extra memory - so that ob_digit[0] ... ob_digit[abs(ob_size)-1] are actually available. - - CAUTION: Generic code manipulating subtypes of PyVarObject has to - aware that ints abuse ob_size's sign bit. - - 警告: 通用代码操作 PyVarObject 的子类型必须注意 ob_size的符号滥用问题。 -*/ - -struct _longobject { - PyObject_VAR_HEAD - digit ob_digit[1]; -}; -``` - -从源码可以看出 PyLongObject 是变长对象 - -## 类型对象 PyLong_Type - -`源文件:`[Objects/longobject.c](https://github.com/python/cpython/blob/v3.7.0/Objects/longobject.c#L5379) - -```c -// Objects/longobject.c - -PyTypeObject PyLong_Type = { - PyVarObject_HEAD_INIT(&PyType_Type, 0) - "int", /* tp_name */ - offsetof(PyLongObject, ob_digit), /* tp_basicsize */ - sizeof(digit), /* tp_itemsize */ - long_dealloc, /* tp_dealloc */ - 0, /* tp_print */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_reserved */ - long_to_decimal_string, /* tp_repr */ - &long_as_number, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - (hashfunc)long_hash, /* tp_hash */ - 0, /* tp_call */ - long_to_decimal_string, /* tp_str */ - PyObject_GenericGetAttr, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | - Py_TPFLAGS_LONG_SUBCLASS, /* tp_flags */ - long_doc, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - long_richcompare, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - long_methods, /* tp_methods */ - 0, /* tp_members */ - long_getset, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - long_new, /* tp_new */ - PyObject_Del, /* tp_free */ -}; -``` - -## 创建整数对象 - -从 PyLong_Type 可以看出,创建一个整数对象的入口函数为 long_new - -`源文件:`[Objects/clinic/longobject.c.h](https://github.com/python/cpython/blob/v3.7.0/Objects/clinic/longobject.c.h#L0) - -```c -// Objects/clinic/longobject.c.h -/*[clinic input] -preserve -[clinic start generated code]*/ - -static PyObject * -long_new_impl(PyTypeObject *type, PyObject *x, PyObject *obase); - -static PyObject * -long_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) -{ - PyObject *return_value = NULL; - static const char * const _keywords[] = {"", "base", NULL}; - static _PyArg_Parser _parser = {"|OO:int", _keywords, 0}; - PyObject *x = NULL; - PyObject *obase = NULL; - - if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser, - &x, &obase)) { - goto exit; - } - return_value = long_new_impl(type, x, obase); - -exit: - return return_value; -} -``` - -具体实现在 long_new_impl `源文件:`[Objects/longobject.c](https://github.com/python/cpython/blob/v3.7.0/Objects/longobject.c#L4785) - -```c -// Objects/longobject.c - -/*[clinic input] -@classmethod -int.__new__ as long_new - x: object(c_default="NULL") = 0 - / - base as obase: object(c_default="NULL") = 10 -[clinic start generated code]*/ - -static PyObject * -long_new_impl(PyTypeObject *type, PyObject *x, PyObject *obase) -/*[clinic end generated code: output=e47cfe777ab0f24c input=81c98f418af9eb6f]*/ -{ - Py_ssize_t base; - - if (type != &PyLong_Type) - return long_subtype_new(type, x, obase); /* Wimp out */ - if (x == NULL) { - if (obase != NULL) { - PyErr_SetString(PyExc_TypeError, - "int() missing string argument"); - return NULL; - } - return PyLong_FromLong(0L); - } - if (obase == NULL) - return PyNumber_Long(x); - - base = PyNumber_AsSsize_t(obase, NULL); - if (base == -1 && PyErr_Occurred()) - return NULL; - if ((base != 0 && base < 2) || base > 36) { - PyErr_SetString(PyExc_ValueError, - "int() base must be >= 2 and <= 36, or 0"); - return NULL; - } - - if (PyUnicode_Check(x)) - return PyLong_FromUnicodeObject(x, (int)base); - else if (PyByteArray_Check(x) || PyBytes_Check(x)) { - char *string; - if (PyByteArray_Check(x)) - string = PyByteArray_AS_STRING(x); - else - string = PyBytes_AS_STRING(x); - return _PyLong_FromBytes(string, Py_SIZE(x), (int)base); - } - else { - PyErr_SetString(PyExc_TypeError, - "int() can't convert non-string with explicit base"); - return NULL; - } -} -``` - -从 long_new_impl 函数可以看出有如下几种情况 - -- x == NULL 且 obase != NULL 调用 PyLong_FromLong -- obase 为 NULL 调用 PyNumber_Long -- x 和 obase 都不为 NULL - - PyUnicode 调用 PyLong_FromUnicodeObject,最终调用 PyLong_FromString - - PyByteArray/PyBytes 调用\_PyLong_FromBytes,最终调用 PyLong_FromString - -## 小整数对象 - -一些整数在一开始就会被初始化一直留存,当再次使用直接从小整数对象池中获取,不用频繁的申请内存。 - -默认的小整数范围是 [-5, 257) `源文件:`[Objects/longobject.c](https://github.com/python/cpython/blob/v3.7.0/Objects/longobject.c#L17) - -```c -// Objects/longobject.c - -#ifndef NSMALLPOSINTS -#define NSMALLPOSINTS 257 -#endif -#ifndef NSMALLNEGINTS -#define NSMALLNEGINTS 5 -#endif - -#if NSMALLNEGINTS + NSMALLPOSINTS > 0 -/* Small integers are preallocated in this array so that they - can be shared. - The integers that are preallocated are those in the range - -NSMALLNEGINTS (inclusive) to NSMALLPOSINTS (not inclusive). */ -static PyLongObject small_ints[NSMALLNEGINTS + NSMALLPOSINTS]; -#ifdef COUNT_ALLOCS -Py_ssize_t quick_int_allocs, quick_neg_int_allocs; -#endif - -static PyObject * -get_small_int(sdigit ival) -{ - PyObject *v; - assert(-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS); - v = (PyObject *)&small_ints[ival + NSMALLNEGINTS]; - Py_INCREF(v); -#ifdef COUNT_ALLOCS - if (ival >= 0) - quick_int_allocs++; - else - quick_neg_int_allocs++; -#endif - return v; -} -#define CHECK_SMALL_INT(ival) \ - do if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) { \ - return get_small_int((sdigit)ival); \ - } while(0) -``` - -宏 **CHECK_SMALL_INT** 会检查传入的数是否在小整数范围内,如果是直接返回。 -可以在创建或复制整数对象等函数中找到 **CHECK_SMALL_INT** 的身影,以下只列出了 -**PyLong_FromLong**,就不一一列举了 - -`源文件:`[Objects/longobject.c](https://github.com/python/cpython/blob/v3.7.0/Objects/longobject.c#L239) - -```c -// Object/longobject.c - -PyObject * -PyLong_FromLong(long ival) -{ - PyLongObject *v; - unsigned long abs_ival; - unsigned long t; /* unsigned so >> doesn't propagate sign bit */ - int ndigits = 0; - int sign; - - CHECK_SMALL_INT(ival); - - ... -} -``` - -### 小整数初始化 - -`源文件:`[Objects/longobject.c](https://github.com/python/cpython/blob/v3.7.0/Objects/longobject.c#L5462) - -```c -// Objects/longobject.c - -int -_PyLong_Init(void) -{ -#if NSMALLNEGINTS + NSMALLPOSINTS > 0 - int ival, size; - PyLongObject *v = small_ints; - - for (ival = -NSMALLNEGINTS; ival < NSMALLPOSINTS; ival++, v++) { - size = (ival < 0) ? -1 : ((ival == 0) ? 0 : 1); - if (Py_TYPE(v) == &PyLong_Type) { - /* The element is already initialized, most likely - * the Python interpreter was initialized before. - */ - Py_ssize_t refcnt; - PyObject* op = (PyObject*)v; - - refcnt = Py_REFCNT(op) < 0 ? 0 : Py_REFCNT(op); - _Py_NewReference(op); - /* _Py_NewReference sets the ref count to 1 but - * the ref count might be larger. Set the refcnt - * to the original refcnt + 1 */ - Py_REFCNT(op) = refcnt + 1; - assert(Py_SIZE(op) == size); - assert(v->ob_digit[0] == (digit)abs(ival)); - } - else { - (void)PyObject_INIT(v, &PyLong_Type); - } - Py_SIZE(v) = size; - v->ob_digit[0] = (digit)abs(ival); - } -#endif - _PyLong_Zero = PyLong_FromLong(0); - if (_PyLong_Zero == NULL) - return 0; - _PyLong_One = PyLong_FromLong(1); - if (_PyLong_One == NULL) - return 0; - - /* initialize int_info */ - if (Int_InfoType.tp_name == NULL) { - if (PyStructSequence_InitType2(&Int_InfoType, &int_info_desc) < 0) - return 0; - } - - return 1; -} -``` - -## 整数的存储结构 - -`源文件:`[Objects/longobject.c](https://github.com/python/cpython/blob/v3.7.0/Objects/longobject.c#L1581) - -在 **long_to_decimal_string_internal**中添加如下代码并重新编译安装 - -```c -// Objects/longobject.c -static int -long_to_decimal_string_internal(PyObject *aa, - PyObject **p_output, - _PyUnicodeWriter *writer, - _PyBytesWriter *bytes_writer, - char **bytes_str) -{ - PyLongObject *scratch, *a; - PyObject *str = NULL; - Py_ssize_t size, strlen, size_a, i, j; - digit *pout, *pin, rem, tenpow; - int negative; - int d; - enum PyUnicode_Kind kind; - - a = (PyLongObject *)aa; - - // 添加打印代码 - printf("ob_size = %d\n", Py_SIZE(a)); - for (int index = 0; index < Py_SIZE(a); ++index) { - printf("ob_digit[%d] = %d\n", index, a->ob_digit[index]); - } - - ... -} -``` - -编译安装后进入 python 解释器输入如下代码 - -```python -num = 9223372043297226753 -print(num) - -# output ->>> ob_size = 3 ->>> ob_digit[0] = 1 ->>> ob_digit[1] = 6 ->>> ob_digit[2] = 8 ->>> 9223372043297226753 -``` - -如下图所示 - -![longobject storage](long-storage.png) - -注:这里的 30 是由 **PyLong_SHIFT** 决定的,64 位系统中,**PyLong_SHIFT** 为 30,否则 **PyLong_SHIFT** 为 15 - -## 整数对象的数值操作 - -可以看到整数对象的数值操作较多,由于篇幅限制无法一一分析,这里只分析整数的部分操作 - -`源文件:`[Objects/longobject.c](https://github.com/python/cpython/blob/v3.7.0/Objects/longobject.c#L5341) - -```c -// Objects/longobject.c - -static PyNumberMethods long_as_number = { - (binaryfunc)long_add, /*nb_add 加法 */ - (binaryfunc)long_sub, /*nb_subtract 减法 */ - (binaryfunc)long_mul, /*nb_multiply 乘法 */ - long_mod, /*nb_remainder 取余 */ - long_divmod, /*nb_divmod */ - long_pow, /*nb_power 求幂 */ - (unaryfunc)long_neg, /*nb_negative */ - (unaryfunc)long_long, /*tp_positive */ - (unaryfunc)long_abs, /*tp_absolute 绝对值 */ - (inquiry)long_bool, /*tp_bool 求bool值 */ - (unaryfunc)long_invert, /*nb_invert 反转 */ - long_lshift, /*nb_lshift 逻辑左移 */ - (binaryfunc)long_rshift, /*nb_rshift 逻辑右移 */ - long_and, /*nb_and 与操作 */ - long_xor, /*nb_xor 异或 */ - long_or, /*nb_or 或操作 */ - long_long, /*nb_int*/ - 0, /*nb_reserved*/ - long_float, /*nb_float*/ - 0, /* nb_inplace_add */ - 0, /* nb_inplace_subtract */ - 0, /* nb_inplace_multiply */ - 0, /* nb_inplace_remainder */ - 0, /* nb_inplace_power */ - 0, /* nb_inplace_lshift */ - 0, /* nb_inplace_rshift */ - 0, /* nb_inplace_and */ - 0, /* nb_inplace_xor */ - 0, /* nb_inplace_or */ - long_div, /* nb_floor_divide */ - long_true_divide, /* nb_true_divide */ - 0, /* nb_inplace_floor_divide */ - 0, /* nb_inplace_true_divide */ - long_long, /* nb_index */ -}; -``` - -### 整数相加 - -`源文件:`[Objects/longobject.c](https://github.com/python/cpython/blob/v3.7.0/Objects/longobject.c#L3081) - -```c -// Objects/longobject.c - -static PyObject * -long_add(PyLongObject *a, PyLongObject *b) -{ - PyLongObject *z; - - CHECK_BINOP(a, b); - - if (Py_ABS(Py_SIZE(a)) <= 1 && Py_ABS(Py_SIZE(b)) <= 1) { - return PyLong_FromLong(MEDIUM_VALUE(a) + MEDIUM_VALUE(b)); - } - if (Py_SIZE(a) < 0) { - if (Py_SIZE(b) < 0) { - z = x_add(a, b); - if (z != NULL) { - /* x_add received at least one multiple-digit int, - and thus z must be a multiple-digit int. - That also means z is not an element of - small_ints, so negating it in-place is safe. */ - assert(Py_REFCNT(z) == 1); - Py_SIZE(z) = -(Py_SIZE(z)); - } - } - else - z = x_sub(b, a); - } - else { - if (Py_SIZE(b) < 0) - z = x_sub(a, b); - else - z = x_add(a, b); - } - return (PyObject *)z; -} -``` - -可以看到整数的加法运算函数 long_add 根据 a、b 的 ob_size 又细分为两个函数 (x_add 和 x_sub) 做处理 - -`源文件:`[Objects/longobject.c](https://github.com/python/cpython/blob/v3.7.0/Objects/longobject.c#L2991) - -```c -// Objects/longobject.c - -/* Add the absolute values of two integers. */ -static PyLongObject * -x_add(PyLongObject *a, PyLongObject *b) -{ - Py_ssize_t size_a = Py_ABS(Py_SIZE(a)), size_b = Py_ABS(Py_SIZE(b)); - PyLongObject *z; - Py_ssize_t i; - digit carry = 0; - - /* Ensure a is the larger of the two: */ - // 确保 a 大于 b - if (size_a < size_b) { - { PyLongObject *temp = a; a = b; b = temp; } - { Py_ssize_t size_temp = size_a; - size_a = size_b; - size_b = size_temp; } - } - z = _PyLong_New(size_a+1); - if (z == NULL) - return NULL; - for (i = 0; i < size_b; ++i) { - carry += a->ob_digit[i] + b->ob_digit[i]; - z->ob_digit[i] = carry & PyLong_MASK; - carry >>= PyLong_SHIFT; - } - for (; i < size_a; ++i) { - carry += a->ob_digit[i]; - z->ob_digit[i] = carry & PyLong_MASK; - carry >>= PyLong_SHIFT; - } - z->ob_digit[i] = carry; - return long_normalize(z); -} -``` - -加法运算函数 x_add 从 ob_digit 数组的低位开始依次按位相加,carry 做进位处理,然后处理 a 对象的高位数字,最后使用 long_normalize 函数调整 ob_size,确保 ob_digit[abs(ob_size)-1]不为零,这与普通四则运算的加法运算相同,只不过进位单元不同而已 - -![longobject x_add](long-x-add.png) - -`源文件:`[Objects/longobject.c](https://github.com/python/cpython/blob/v3.7.0/Objects/longobject.c#L3025) - -```c -// Objects/longobject.c - -/* Subtract the absolute values of two integers. */ - -static PyLongObject * -x_sub(PyLongObject *a, PyLongObject *b) -{ - Py_ssize_t size_a = Py_ABS(Py_SIZE(a)), size_b = Py_ABS(Py_SIZE(b)); - PyLongObject *z; - Py_ssize_t i; - int sign = 1; - digit borrow = 0; - - /* Ensure a is the larger of the two: */ - // 确保 a 大于 b - if (size_a < size_b) { - sign = -1; - { PyLongObject *temp = a; a = b; b = temp; } - { Py_ssize_t size_temp = size_a; - size_a = size_b; - size_b = size_temp; } - } - else if (size_a == size_b) { - /* Find highest digit where a and b differ: */ - // 找到最高位 a 与 b的差异 - i = size_a; - while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i]) - ; - if (i < 0) - return (PyLongObject *)PyLong_FromLong(0); - if (a->ob_digit[i] < b->ob_digit[i]) { - sign = -1; - { PyLongObject *temp = a; a = b; b = temp; } - } - size_a = size_b = i+1; - } - z = _PyLong_New(size_a); - if (z == NULL) - return NULL; - for (i = 0; i < size_b; ++i) { - /* The following assumes unsigned arithmetic - works module 2**N for some N>PyLong_SHIFT. */ - borrow = a->ob_digit[i] - b->ob_digit[i] - borrow; - z->ob_digit[i] = borrow & PyLong_MASK; - borrow >>= PyLong_SHIFT; - borrow &= 1; /* Keep only one sign bit */ - } - for (; i < size_a; ++i) { - borrow = a->ob_digit[i] - borrow; - z->ob_digit[i] = borrow & PyLong_MASK; - borrow >>= PyLong_SHIFT; - borrow &= 1; /* Keep only one sign bit */ - } - assert(borrow == 0); - if (sign < 0) { - Py_SIZE(z) = -Py_SIZE(z); - } - return long_normalize(z); -} -``` - -与普通四则运算减法相同,数不够大则向高一位借位, -减法运算函数 x_sub 的示例图如下,注:PyLong_SHIFT 为 30 - -![longobject x_sub](long-x-sub.png) - -### 整数相乘 - -`源文件:`[Objects/longobject.c](https://github.com/python/cpython/blob/v3.7.0/Objects/longobject.c#L3547) - -```c -// Objects/longobject.c -static PyObject * -long_mul(PyLongObject *a, PyLongObject *b) -{ - PyLongObject *z; - - CHECK_BINOP(a, b); - - /* fast path for single-digit multiplication */ - if (Py_ABS(Py_SIZE(a)) <= 1 && Py_ABS(Py_SIZE(b)) <= 1) { - stwodigits v = (stwodigits)(MEDIUM_VALUE(a)) * MEDIUM_VALUE(b); - return PyLong_FromLongLong((long long)v); - } - - z = k_mul(a, b); - /* Negate if exactly one of the inputs is negative. */ - if (((Py_SIZE(a) ^ Py_SIZE(b)) < 0) && z) { - _PyLong_Negate(&z); - if (z == NULL) - return NULL; - } - return (PyObject *)z; -} -``` - -k_mul 函数是一种快速乘法 [源文件](https://github.com/python/cpython/blob/v3.7.0/Objects/longobject.c#L3268) - -> Karatsuba 的算法主要是用于两个大数的乘法,极大提高了运算效率,相较于普通乘法降低了复杂度,并在其中运用了递归的思想。 -> 基本的原理和做法是将位数很多的两个大数 x 和 y 分成位数较少的数,每个数都是原来 x 和 y 位数的一半。 -> 这样处理之后,简化为做三次乘法,并附带少量的加法操作和移位操作。 - -具体可以看 wiki [Karatsuba 算法](https://www.wikiwand.com/zh-hans/Karatsuba算法)的实现 diff --git a/objects/object/index.html b/objects/object/index.html new file mode 100644 index 0000000..7e8b185 --- /dev/null +++ b/objects/object/index.html @@ -0,0 +1,763 @@ + + + + + + + Python 对象初探 · Python 3 源码分析 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            +
            + + + + + + + + +
            + +
            + +
            + + + + + + + + +
            +
            + +
            +
            + +
            + +

            Python 对象初探

            +

            在 Python 的世界一切皆对象,不论是整数,还是字符串,甚至连类型、函数等都是一种对象。

            +

            对象的分类

            +

            以下是 Python 对象的大致的一个分类

            +
              +
            • Fundamental 对象: 类型对象
            • +
            • Numeric 对象: 数值对象
            • +
            • Sequence 对象: 容纳其他对象的序列集合对象
            • +
            • Mapping 对象: 类似 C++中的 map 的关联对象
            • +
            • Internal 对象: Python 虚拟机在运行时内部使用的对象
            • +
            +

            object category

            +

            对象机制的基石 PyObject

            +

            对于初学者来说这么多类型的对象怎么学?别着急,我们后续章节会解答。

            +

            在开始我们的学习之旅之前,我们要先认识一个结构体PyObject,可以说 Python 的对象机制就是基于PyObject拓展开来的,所以我们先看看PyObject 到底长什么样。

            +

            源文件:Include/object.h

            +
            // Include/object.h
            +#define _PyObject_HEAD_EXTRA            \
            +    struct _object *_ob_next;           \
            +    struct _object *_ob_prev;
            +
            +typedef struct _object {
            +    _PyObject_HEAD_EXTRA    // 双向链表 垃圾回收 需要用到
            +    Py_ssize_t ob_refcnt;   // 引用计数
            +    struct _typeobject *ob_type;    // 指向类型对象的指针,决定了对象的类型
            +} PyObject;
            +
            +

            Python 中的所有对象都拥有一些相同的内容,而这些内容就定义在PyObject中,

            +

            PyObject 包含 一个用于垃圾回收的双向链表,一个引用计数变量 ob_refcnt 和 一个类型对象指针ob_type

            +

            PyObject

            +

            定长对象与变长对象

            +

            Python 对象除了前面提到的那种分类方法外,还可以分为定长对象和变长对象这两种形式。

            +

            变长对象都拥有一个相同的内容 PyVarObject,而 PyVarObject也是基于PyObject扩展的。

            +

            从代码中可以看出PyVarObjectPyObject多出了一个用于存储元素个数的变量ob_size

            +

            源文件:Include/object.h

            +
            // Include/object.h
            +typedef struct _object {
            +    _PyObject_HEAD_EXTRA
            +    Py_ssize_t ob_refcnt;
            +    struct _typeobject *ob_type;
            +} PyObject;
            +
            +typedef struct {
            +    PyObject ob_base;
            +    Py_ssize_t ob_size; /* Number of items in variable part */
            +} PyVarObject;
            +
            +

            PyVarObject

            +

            类型对象

            +

            前面我们提到了PyObject 的 对象类型指针struct _typeobject *ob_type,它指向的类型对象就决定了一个对象是什么类型的。

            +

            这是一个非常重要的结构体,它不仅仅决定了一个对象的类型,还包含大量的元信息, +包括创建对象需要分配多少内存,对象都支持哪些操作等等。

            +

            接下来我们看一下struct _typeobject代码

            +

            PyTypeObject 的定义中包含许多信息,主要分类以下几类:

            +
              +
            • 类型名, tp_name, 主要用于 Python 内部调试用
            • +
            • 创建该类型对象时分配的空间大小信息,即 tp_basicsizetp_itemsize
            • +
            • 与该类型对象相关的操作信息(如 tp_print 这样的函数指针)
            • +
            • 一些对象属性
            • +
            +

            源文件:Include/object.h

            +
            // Include/object.h
            +typedef struct _typeobject {
            +    PyObject_VAR_HEAD
            +    const char *tp_name; /* For printing, in format "<module>.<name>" */ // 类型名
            +    Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */
            +    // 创建该类型对象分配的内存空间大小
            +
            +    // 一堆方法定义,函数和指针
            +    /* Methods to implement standard operations */
            +    destructor tp_dealloc;
            +    printfunc tp_print;
            +    getattrfunc tp_getattr;
            +    setattrfunc tp_setattr;
            +    PyAsyncMethods *tp_as_async; /* formerly known as tp_compare (Python 2)
            +                                    or tp_reserved (Python 3) */
            +    reprfunc tp_repr;
            +
            +    /* Method suites for standard classes */
            +    // 标准类方法集
            +    PyNumberMethods *tp_as_number;  // 数值对象操作
            +    PySequenceMethods *tp_as_sequence;  // 序列对象操作
            +    PyMappingMethods *tp_as_mapping;  // 字典对象操作
            +
            +    // 更多标准操作
            +    /* More standard operations (here for binary compatibility) */
            +    hashfunc tp_hash;
            +    ternaryfunc tp_call;
            +    reprfunc tp_str;
            +    getattrofunc tp_getattro;
            +    setattrofunc tp_setattro;
            +
            +    ......
            +
            +} PyTypeObject;
            +
            +

            类型的类型

            +

            PyTypeObjet 定义开始有一个宏PyOject_VAR_HEAD,查看源码可知 PyTypeObjet 是一个变长对象

            +

            源文件:Include/object.h

            +
            // Include/object.h
            +#define PyObject_VAR_HEAD      PyVarObject ob_base;
            +
            +

            对象的类型是由该对象指向的 类型对象 决定的,那么类型对象的类型是由谁决定的呢? +对于其他对象,可以通过与其关联的类型对象确定其类型,那么通过什么来确定一个对象是类型对象呢? +答案就是 PyType_Type

            +

            源文件:Objects/typeobject.c

            +
            // Objects/typeobject.c
            +PyTypeObject PyType_Type = {
            +    PyVarObject_HEAD_INIT(&PyType_Type, 0)
            +    "type",                                     /* tp_name */
            +    sizeof(PyHeapTypeObject),                   /* tp_basicsize */
            +    sizeof(PyMemberDef),                        /* tp_itemsize */
            +
            +    ......
            +};
            +
            +

            PyType_Type 在类型机制中至关重要,所有用户自定义 class 所 +对应的 PyTypeObject 对象都是通过 PyType_Type创建的

            +

            接下来我们看 PyLong_Type 是怎么与 PyType_Type 建立联系的。 +前面提到,在 Python 中,每一个对象都将自己的引用计数、类型信息保存在开始的部分中。 +为了方便对这部分内存初始化,Python 中提供了几个有用的宏:

            +

            源文件:Include/object.h

            +
            // Include/object.h
            +#ifdef Py_TRACE_REFS
            +    #define _PyObject_EXTRA_INIT 0, 0,
            +#else
            +    #define _PyObject_EXTRA_INIT
            +#endif
            +
            +#define PyObject_HEAD_INIT(type)        \
            +    { _PyObject_EXTRA_INIT              \
            +    1, type },
            +
            +

            这些宏在各种内建类型对象的初始化中被大量使用。 +以PyLong_Type为例,可以清晰的看到一般的类型对象和PyType_Type之间的关系

            +

            源文件:Objects/longobject.c

            +
            // Objects/longobject.c
            +
            +PyTypeObject PyLong_Type = {
            +    PyVarObject_HEAD_INIT(&PyType_Type, 0)
            +    "int",                                      /* tp_name */
            +    offsetof(PyLongObject, ob_digit),           /* tp_basicsize */
            +    sizeof(digit),                              /* tp_itemsize */
            +
            +    ......
            +};
            +
            +

            下图是对象运行时的图像表现

            +

            +

            对象的创建

            +

            Python 创建对象有两种方式

            +

            范型 API 或称为 AOL (Abstract Object Layer)

            +

            这类 API 通常形如PyObject_XXX这样的形式。可以应用在任何 Python 对象上, +如PyObject_New。创建一个整数对象的方式

            +
            PyObject* longobj = PyObject_New(Pyobject, &PyLong_Type);
            +
            +

            与类型相关的 API 或称为 COL (Concrete Object Layer)

            +

            这类 API 通常只能作用于某一种类型的对象上,对于每一种内建对象 +Python 都提供了这样一组 API。例如整数对象,我们可以利用如下的 API 创建

            +
            PyObject *longObj = PyLong_FromLong(10);
            +
            +

            对象的行为

            +

            PyTypeObject 中定义了大量的函数指针。这些函数指针可以视为类型对象中 +所定义的操作,这些操作直接决定着一个对象在运行时所表现出的行为,比如 PyTypeObject 中的 tp_hash 指明了该类型对象如何生成其hash值。

            +

            PyTypeObject的代码中,我们还可以看到非常重要的三组操作族

            +
              +
            • PyNumberMethods *tp_as_number
            • +
            • PySequenceMethods *tp_as_sequence
            • +
            • PyMappingMethods *tp_as_mapping
            • +
            +

            PyNumberMethods 的代码如下

            +

            源文件:Include/object.h

            +
            // Include/object.h
            +typedef PyObject * (*binaryfunc)(PyObject *, PyObject *);
            +
            +typedef struct {
            +    binaryfunc nb_matrix_multiply;
            +    binaryfunc nb_inplace_matrix_multiply;
            +
            +    ......
            +} PyNumberMethods;
            +
            +

            PyNumberMethods 定义了一个数值对象该支持的操作。一个数值对象如 整数对象,那么它的类型对象 PyLong_Typetp_as_number.nb_add +就指定了它进行加法操作时的具体行为。

            +

            在以下代码中可以看出PyLong_Type中的tp_as_number项指向的是long_as_number

            +

            源文件:Objects/longobject.h

            +
            // Objects/longobject.c
            +static PyNumberMethods long_as_number = {
            +    (binaryfunc)long_add,       /*nb_add*/
            +    (binaryfunc)long_sub,       /*nb_subtract*/
            +    (binaryfunc)long_mul,       /*nb_multiply*/
            +
            +    ......
            +};
            +
            +PyTypeObject PyLong_Type = {
            +    PyVarObject_HEAD_INIT(&PyType_Type, 0)
            +    "int",                                      /* tp_name */
            +    offsetof(PyLongObject, ob_digit),           /* tp_basicsize */
            +    sizeof(digit),                              /* tp_itemsize */
            +    long_dealloc,                               /* tp_dealloc */
            +    0,                                          /* tp_print */
            +    0,                                          /* tp_getattr */
            +    0,                                          /* tp_setattr */
            +    0,                                          /* tp_reserved */
            +    long_to_decimal_string,                     /* tp_repr */
            +    &long_as_number,                            /* tp_as_number */
            +    0,                                          /* tp_as_sequence */
            +    0,                                          /* tp_as_mapping */
            +
            +    ......
            +};
            +
            +

            PySequenceMethods *tp_as_sequencePyMappingMethods *tp_as_mapping的分析与PyNumberMethods *tp_as_number 相同,大家可以自行查阅源码

            +

            对象的多态性

            +

            Python 创建一个对象比如 PyLongObject 时,会分配内存进行初始化,然后 +Python 内部会用 PyObject* 变量来维护这个对象,其他对象也与此类似

            +

            所以在 Python 内部各个函数之间传递的都是一种范型指针 PyObject* +我们不知道这个指针所指的对象是什么类型,只能通过所指对象的 ob_type 域 +动态进行判断,而 Python 正是通过 ob_type 实现了多态机制

            +

            考虑以下的 calc_hash 函数

            +
            Py_hash_t
            +calc_hash(PyObject* object)
            +{
            +    Py_hash_t hash = object->ob_type->tp_hash(object);
            +    return hash;
            +}
            +
            +

            如果传递给 calc_hash 函数的指针是一个 PyLongObject*,那么它会调用 PyLongObject 对象对应的类型对象中定义的 hash 操作tp_hashtp_hash可以在PyTypeObject中找到, +而具体赋值绑定我们可以在 PyLong_Type 初始化代码中看到绑定的是long_hash函数

            +

            源文件:Objects/longobject.c

            +
            // Objects/longobject.c
            +PyTypeObject PyLong_Type = {
            +    PyVarObject_HEAD_INIT(&PyType_Type, 0)
            +    "int",                                      /* tp_name */
            +    ...
            +
            +    (hashfunc)long_hash,                        /* tp_hash */
            +
            +    ...
            +};
            +
            +

            如果指针是一个 PyUnicodeObject*,那么就会调用 PyUnicodeObject 对象对应的类型对象中定义的 hash 操作,查看源码可以看到 实际绑定的是 unicode_hash函数

            +

            源文件:Objects/unicodeobject.c

            +
            // Objects/unicodeobject.c
            +PyTypeObject PyUnicode_Type = {
            +    PyVarObject_HEAD_INIT(&PyType_Type, 0)
            +    "str",              /* tp_name */
            +
            +    ...
            +
            +    (hashfunc) unicode_hash,        /* tp_hash*/
            +
            +    ...
            +};
            +
            +

            引用计数

            +

            Python 通过引用计数来管理维护对象在内存中的存在与否

            +

            Python 中的每个东西都是一个对象, 都有ob_refcnt 变量,这个变量维护对象的引用计数,从而最终决定该对象的创建与销毁

            +

            在 Python 中,主要通过 Py_INCREF(op)Py_DECREF(op) 这两个宏 +来增加和减少对一个对象的引用计数。当一个对象的引用计数减少到 0 之后, +Py_DECREF将调用该对象的tp_dealloc来释放对象所占用的内存和系统资源;

            +

            但这并不意味着最终一定会调用 free 释放内存空间。因为频繁的申请、释放内存会大大降低 Python 的执行效率。因此 Python 中大量采用了内存对象池的技术,使得对象释放的空间归还给内存池而不是直接free,后续使用可先从对象池中获取

            +

            源文件:Include/object.h

            +
            // Include/object.h
            +#define _Py_NewReference(op) (                          \
            +    _Py_INC_TPALLOCS(op) _Py_COUNT_ALLOCS_COMMA         \
            +    _Py_INC_REFTOTAL  _Py_REF_DEBUG_COMMA               \
            +    Py_REFCNT(op) = 1)
            +
            +#define Py_INCREF(op) (                         \
            +    _Py_INC_REFTOTAL  _Py_REF_DEBUG_COMMA       \
            +    ((PyObject *)(op))->ob_refcnt++)
            +
            +#define Py_DECREF(op)                                   \
            +    do {                                                \
            +        PyObject *_py_decref_tmp = (PyObject *)(op);    \
            +        if (_Py_DEC_REFTOTAL  _Py_REF_DEBUG_COMMA       \
            +        --(_py_decref_tmp)->ob_refcnt != 0)             \
            +            _Py_CHECK_REFCNT(_py_decref_tmp)            \
            +        else                                            \
            +            _Py_Dealloc(_py_decref_tmp);                \
            +    } while (0)
            +
            +
            Copyright © FlagGo 2019 all right reserved,powered by Gitbook该文件修订时间: +2020-03-23 19:36:27 +
            + +
            + +
            +
            +
            + +

            results matching ""

            +
              + +
              +
              + +

              No results matching ""

              + +
              +
              +
              + +
              +
              + +
              + + + + + + + + + + + + + + +
              + + +
              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/objects/object/index.md b/objects/object/index.md deleted file mode 100644 index b10bc34..0000000 --- a/objects/object/index.md +++ /dev/null @@ -1,375 +0,0 @@ -# Python 对象初探 - -在 Python 的世界一切皆对象,不论是整数,还是字符串,甚至连类型、函数等都是一种对象。 - -## 对象的分类 - -以下是 Python 对象的大致的一个分类 - -- Fundamental 对象: 类型对象 -- Numeric 对象: 数值对象 -- Sequence 对象: 容纳其他对象的序列集合对象 -- Mapping 对象: 类似 C++中的 map 的关联对象 -- Internal 对象: Python 虚拟机在运行时内部使用的对象 - -![object category](object-category.jpg) - -## 对象机制的基石 PyObject - -对于初学者来说这么多类型的对象怎么学?别着急,我们后续章节会解答。 - -在开始我们的学习之旅之前,我们要先认识一个结构体**PyObject**,可以说 Python 的对象机制就是基于**PyObject**拓展开来的,所以我们先看看**PyObject** 到底长什么样。 - -`源文件:`[Include/object.h](https://github.com/python/cpython/blob/v3.7.0/Include/object.h#L106) - -```c -// Include/object.h -#define _PyObject_HEAD_EXTRA \ - struct _object *_ob_next; \ - struct _object *_ob_prev; - -typedef struct _object { - _PyObject_HEAD_EXTRA // 双向链表 垃圾回收 需要用到 - Py_ssize_t ob_refcnt; // 引用计数 - struct _typeobject *ob_type; // 指向类型对象的指针,决定了对象的类型 -} PyObject; -``` - -Python 中的所有对象都拥有一些相同的内容,而这些内容就定义在**PyObject**中, - -**PyObject** 包含 一个用于垃圾回收的双向链表,一个引用计数变量 `ob_refcnt` 和 一个类型对象指针`ob_type` - -![PyObject](PyObject.jpg) - -## 定长对象与变长对象 - -Python 对象除了前面提到的那种分类方法外,还可以分为定长对象和变长对象这两种形式。 - -变长对象都拥有一个相同的内容 **PyVarObject**,而 **PyVarObject**也是基于**PyObject**扩展的。 - -从代码中可以看出**PyVarObject**比**PyObject**多出了一个用于存储元素个数的变量*ob_size*。 - -`源文件:`[Include/object.h](https://github.com/python/cpython/blob/v3.7.0/Include/object.h#L106) - -```c -// Include/object.h -typedef struct _object { - _PyObject_HEAD_EXTRA - Py_ssize_t ob_refcnt; - struct _typeobject *ob_type; -} PyObject; - -typedef struct { - PyObject ob_base; - Py_ssize_t ob_size; /* Number of items in variable part */ -} PyVarObject; -``` - -![PyVarObject](PyVarObject.jpg) - -## 类型对象 - -前面我们提到了**PyObject** 的 对象类型指针`struct _typeobject *ob_type`,它指向的类型对象就决定了一个对象是什么类型的。 - -这是一个非常重要的结构体,它不仅仅决定了一个对象的类型,还包含大量的`元信息`, -包括创建对象需要分配多少内存,对象都支持哪些操作等等。 - -接下来我们看一下`struct _typeobject`代码 - -在 **PyTypeObject** 的定义中包含许多信息,主要分类以下几类: - -- 类型名, tp_name, 主要用于 Python 内部调试用 -- 创建该类型对象时分配的空间大小信息,即 `tp_basicsize` 和 `tp_itemsize` -- 与该类型对象相关的操作信息(如 `tp_print` 这样的函数指针) -- 一些对象属性 - -`源文件:`[Include/object.h](https://github.com/python/cpython/blob/v3.7.0/Include/object.h#L346) - -```c -// Include/object.h -typedef struct _typeobject { - PyObject_VAR_HEAD - const char *tp_name; /* For printing, in format "." */ // 类型名 - Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */ - // 创建该类型对象分配的内存空间大小 - - // 一堆方法定义,函数和指针 - /* Methods to implement standard operations */ - destructor tp_dealloc; - printfunc tp_print; - getattrfunc tp_getattr; - setattrfunc tp_setattr; - PyAsyncMethods *tp_as_async; /* formerly known as tp_compare (Python 2) - or tp_reserved (Python 3) */ - reprfunc tp_repr; - - /* Method suites for standard classes */ - // 标准类方法集 - PyNumberMethods *tp_as_number; // 数值对象操作 - PySequenceMethods *tp_as_sequence; // 序列对象操作 - PyMappingMethods *tp_as_mapping; // 字典对象操作 - - // 更多标准操作 - /* More standard operations (here for binary compatibility) */ - hashfunc tp_hash; - ternaryfunc tp_call; - reprfunc tp_str; - getattrofunc tp_getattro; - setattrofunc tp_setattro; - - ...... - -} PyTypeObject; -``` - -## 类型的类型 - -在 **PyTypeObjet** 定义开始有一个宏`PyOject_VAR_HEAD`,查看源码可知 **PyTypeObjet** 是一个变长对象 - -`源文件:`[Include/object.h](https://github.com/python/cpython/blob/v3.7.0/Include/object.h#L98) - -```c -// Include/object.h -#define PyObject_VAR_HEAD PyVarObject ob_base; -``` - -对象的类型是由该对象指向的 类型对象 决定的,那么类型对象的类型是由谁决定的呢? -对于其他对象,可以通过与其关联的类型对象确定其类型,那么通过什么来确定一个对象是类型对象呢? -答案就是 `PyType_Type` - -`源文件:`[Objects/typeobject.c](https://github.com/python/cpython/blob/v3.7.0/Objects/typeobject.c#L3540) - -```c -// Objects/typeobject.c -PyTypeObject PyType_Type = { - PyVarObject_HEAD_INIT(&PyType_Type, 0) - "type", /* tp_name */ - sizeof(PyHeapTypeObject), /* tp_basicsize */ - sizeof(PyMemberDef), /* tp_itemsize */ - - ...... -}; -``` - -`PyType_Type` 在类型机制中至关重要,所有用户自定义 `class` 所 -对应的 `PyTypeObject` 对象都是通过 `PyType_Type`创建的 - -接下来我们看 `PyLong_Type` 是怎么与 `PyType_Type` 建立联系的。 -前面提到,在 Python 中,每一个对象都将自己的引用计数、类型信息保存在开始的部分中。 -为了方便对这部分内存初始化,Python 中提供了几个有用的宏: - -`源文件:`[Include/object.h](https://github.com/python/cpython/blob/v3.7.0/Include/object.h#L69) - -```c -// Include/object.h -#ifdef Py_TRACE_REFS - #define _PyObject_EXTRA_INIT 0, 0, -#else - #define _PyObject_EXTRA_INIT -#endif - -#define PyObject_HEAD_INIT(type) \ - { _PyObject_EXTRA_INIT \ - 1, type }, -``` - -这些宏在各种内建类型对象的初始化中被大量使用。 -以`PyLong_Type`为例,可以清晰的看到一般的类型对象和`PyType_Type`之间的关系 - -`源文件:`[Objects/longobject.c](https://github.com/python/cpython/blob/v3.7.0/Objects/longobject.c#L5379) - -```c -// Objects/longobject.c - -PyTypeObject PyLong_Type = { - PyVarObject_HEAD_INIT(&PyType_Type, 0) - "int", /* tp_name */ - offsetof(PyLongObject, ob_digit), /* tp_basicsize */ - sizeof(digit), /* tp_itemsize */ - - ...... -}; -``` - -下图是对象运行时的图像表现 - -![](object-runtime-relation.jpg) - -## 对象的创建 - -Python 创建对象有两种方式 - -### 范型 API 或称为 AOL (Abstract Object Layer) - -这类 API 通常形如`PyObject_XXX`这样的形式。可以应用在任何 Python 对象上, -如`PyObject_New`。创建一个整数对象的方式 - -```c -PyObject* longobj = PyObject_New(Pyobject, &PyLong_Type); -``` - -### 与类型相关的 API 或称为 COL (Concrete Object Layer) - -这类 API 通常只能作用于某一种类型的对象上,对于每一种内建对象 -Python 都提供了这样一组 API。例如整数对象,我们可以利用如下的 API 创建 - -```c -PyObject *longObj = PyLong_FromLong(10); -``` - -## 对象的行为 - -在 **PyTypeObject** 中定义了大量的函数指针。这些函数指针可以视为类型对象中 -所定义的操作,这些操作直接决定着一个对象在运行时所表现出的行为,比如 **PyTypeObject** 中的 `tp_hash` 指明了该类型对象如何生成其`hash`值。 - -在**PyTypeObject**的代码中,我们还可以看到非常重要的三组操作族 - -- `PyNumberMethods *tp_as_number` -- `PySequenceMethods *tp_as_sequence` -- `PyMappingMethods *tp_as_mapping` - -**PyNumberMethods** 的代码如下 - -`源文件:`[Include/object.h](https://github.com/python/cpython/blob/v3.7.0/Include/object.h#L240) - -```c -// Include/object.h -typedef PyObject * (*binaryfunc)(PyObject *, PyObject *); - -typedef struct { - binaryfunc nb_matrix_multiply; - binaryfunc nb_inplace_matrix_multiply; - - ...... -} PyNumberMethods; -``` - -**PyNumberMethods** 定义了一个数值对象该支持的操作。一个数值对象如 整数对象,那么它的类型对象 `PyLong_Type`中`tp_as_number.nb_add` -就指定了它进行加法操作时的具体行为。 - -在以下代码中可以看出`PyLong_Type`中的`tp_as_number`项指向的是`long_as_number` - -`源文件:`[Objects/longobject.h](https://github.com/python/cpython/blob/v3.7.0/Objects/longobject.c#L5342) - -```c -// Objects/longobject.c -static PyNumberMethods long_as_number = { - (binaryfunc)long_add, /*nb_add*/ - (binaryfunc)long_sub, /*nb_subtract*/ - (binaryfunc)long_mul, /*nb_multiply*/ - - ...... -}; - -PyTypeObject PyLong_Type = { - PyVarObject_HEAD_INIT(&PyType_Type, 0) - "int", /* tp_name */ - offsetof(PyLongObject, ob_digit), /* tp_basicsize */ - sizeof(digit), /* tp_itemsize */ - long_dealloc, /* tp_dealloc */ - 0, /* tp_print */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_reserved */ - long_to_decimal_string, /* tp_repr */ - &long_as_number, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - - ...... -}; -``` - -`PySequenceMethods *tp_as_sequence` 和 `PyMappingMethods *tp_as_mapping`的分析与`PyNumberMethods *tp_as_number` 相同,大家可以自行查阅源码 - -## 对象的多态性 - -Python 创建一个对象比如 **PyLongObject** 时,会分配内存进行初始化,然后 -Python 内部会用 `PyObject*` 变量来维护这个对象,其他对象也与此类似 - -所以在 Python 内部各个函数之间传递的都是一种范型指针 `PyObject*` -我们不知道这个指针所指的对象是什么类型,只能通过所指对象的 `ob_type` 域 -动态进行判断,而 Python 正是通过 `ob_type` 实现了多态机制 - -考虑以下的 calc_hash 函数 - -```c -Py_hash_t -calc_hash(PyObject* object) -{ - Py_hash_t hash = object->ob_type->tp_hash(object); - return hash; -} -``` - -如果传递给 calc_hash 函数的指针是一个 `PyLongObject*`,那么它会调用 PyLongObject 对象对应的类型对象中定义的 hash 操作`tp_hash`,`tp_hash`可以在**PyTypeObject**中找到, -而具体赋值绑定我们可以在 `PyLong_Type` 初始化代码中看到绑定的是`long_hash`函数 - -`源文件:`[Objects/longobject.c](https://github.com/python/cpython/blob/v3.7.0/Objects/longobject.c#L5379) - -```c -// Objects/longobject.c -PyTypeObject PyLong_Type = { - PyVarObject_HEAD_INIT(&PyType_Type, 0) - "int", /* tp_name */ - ... - - (hashfunc)long_hash, /* tp_hash */ - - ... -}; -``` - -如果指针是一个 `PyUnicodeObject*`,那么就会调用 PyUnicodeObject 对象对应的类型对象中定义的 hash 操作,查看源码可以看到 实际绑定的是 `unicode_hash`函数 - -`源文件:`[Objects/unicodeobject.c](https://github.com/python/cpython/blob/v3.7.0/Objects/unicodeobject.c#L15066) - -```c -// Objects/unicodeobject.c -PyTypeObject PyUnicode_Type = { - PyVarObject_HEAD_INIT(&PyType_Type, 0) - "str", /* tp_name */ - - ... - - (hashfunc) unicode_hash, /* tp_hash*/ - - ... -}; -``` - -## 引用计数 - -Python 通过引用计数来管理维护对象在内存中的存在与否 - -Python 中的每个东西都是一个对象, 都有`ob_refcnt` 变量,这个变量维护对象的引用计数,从而最终决定该对象的创建与销毁 - -在 Python 中,主要通过 `Py_INCREF(op)`与`Py_DECREF(op)` 这两个宏 -来增加和减少对一个对象的引用计数。当一个对象的引用计数减少到 0 之后, -`Py_DECREF`将调用该对象的`tp_dealloc`来释放对象所占用的内存和系统资源; - -但这并不意味着最终一定会调用 `free` 释放内存空间。因为频繁的申请、释放内存会大大降低 Python 的执行效率。因此 Python 中大量采用了内存对象池的技术,使得对象释放的空间归还给内存池而不是直接`free`,后续使用可先从对象池中获取 - -`源文件:`[Include/object.h](https://github.com/python/cpython/blob/v3.7.0/Include/object.h#L777) - -```c -// Include/object.h -#define _Py_NewReference(op) ( \ - _Py_INC_TPALLOCS(op) _Py_COUNT_ALLOCS_COMMA \ - _Py_INC_REFTOTAL _Py_REF_DEBUG_COMMA \ - Py_REFCNT(op) = 1) - -#define Py_INCREF(op) ( \ - _Py_INC_REFTOTAL _Py_REF_DEBUG_COMMA \ - ((PyObject *)(op))->ob_refcnt++) - -#define Py_DECREF(op) \ - do { \ - PyObject *_py_decref_tmp = (PyObject *)(op); \ - if (_Py_DEC_REFTOTAL _Py_REF_DEBUG_COMMA \ - --(_py_decref_tmp)->ob_refcnt != 0) \ - _Py_CHECK_REFCNT(_py_decref_tmp) \ - else \ - _Py_Dealloc(_py_decref_tmp); \ - } while (0) -``` diff --git a/objects/set-object/index.html b/objects/set-object/index.html new file mode 100644 index 0000000..10dc044 --- /dev/null +++ b/objects/set-object/index.html @@ -0,0 +1,987 @@ + + + + + + + Python Set 对象 · Python 3 源码分析 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              +
              + + + + + + + + +
              + +
              + +
              + + + + + + + + +
              +
              + +
              +
              + +
              + +

              python 集合

              +

              set 是无序且不重复的集合,是可变的,通常用来从列表中删除重复项以及计算数学运算,如交集、并集、差分和对称差分等集合操作。set 支持 x in set, len(set),和 for x in set。作为一个无序的集合,set 不记录元素位置或者插入点。因此,sets 不支持 indexing, 或其它类序列的操作。

              +

              python 集合概述

              +

              在 set 中,对应的 set 的值的存储是通过结构 setentry 来保存数据值的;

              +

              源文件:include/setobject.h

              +
              typedef struct {
              +    PyObject *key;
              +    Py_hash_t hash;             /* Cached hash code of the key */
              +} setentry;
              +
              +

              key 就是保存的数据,hash 就是保存的数据的 hash,便于查找,set 也是基于 hash 表来实现。对应的 setentry 所对应的 set 的数据结构如下;

              +

              源文件:include/setobject.h

              +
              typedef struct {
              +    PyObject_HEAD
              +
              +    Py_ssize_t fill;            /* Number active and dummy entries*/     // 包括已经使用的entry与空entry值的总和
              +    Py_ssize_t used;            /* Number active entries */              // 已经使用可用的总量
              +
              +    /* The table contains mask + 1 slots, and that's a power of 2.
              +     * We store the mask instead of the size because the mask is more
              +     * frequently needed.
              +     */
              +    Py_ssize_t mask;                                // 与hash求和的mask
              +
              +    /* The table points to a fixed-size smalltable for small tables
              +     * or to additional malloc'ed memory for bigger tables.
              +     * The table pointer is never NULL which saves us from repeated
              +     * runtime null-tests.
              +     */
              +    setentry *table;                                                    // 保存数据的数组数组指针
              +    Py_hash_t hash;             /* Only used by frozenset objects */
              +    Py_ssize_t finger;          /* Search finger for pop() */
              +
              +    setentry smalltable[PySet_MINSIZE];                                 // 保存数据的数组 默认初始化为8个元素,通过table指向
              +    PyObject *weakreflist;      /* List of weak references */
              +} PySetObject;
              +
              +

              一个 set 就对应一个 PySetObject 类型数据,set 会根据保存的元素自动调整大小。相关的内存布局如下;

              +

              内存图片

              +

              python 集合(set)示例

              +

              示例脚本如下:

              +
              set_a = {1,2} 
              +set_a.add(3)
              +set_a.add(4)
              +set_a.remove(1)
              +set_a.update({3,})
              +set_a.union({1,5})
              +
              +

              通过 python 反汇编获取该脚本的字节码;

              +
              python -m dis set_test.py
              +

              输出的字节码如下所示;

              +
                1           0 LOAD_CONST               0 (1)
              +              3 LOAD_CONST               1 (2)
              +              6 BUILD_SET                2
              +              9 STORE_NAME               0 (set_a)
              +
              +  2          12 LOAD_NAME                0 (set_a)
              +             15 LOAD_ATTR                1 (add)
              +             18 LOAD_CONST               2 (3)
              +             21 CALL_FUNCTION            1
              +             24 POP_TOP
              +
              +  3          25 LOAD_NAME                0 (set_a)
              +             28 LOAD_ATTR                1 (add)
              +             31 LOAD_CONST               3 (4)
              +             34 CALL_FUNCTION            1
              +             37 POP_TOP
              +
              +  4          38 LOAD_NAME                0 (set_a)
              +             41 LOAD_ATTR                2 (remove)
              +             44 LOAD_CONST               0 (1)
              +             47 CALL_FUNCTION            1
              +             50 POP_TOP
              +
              +  5          51 LOAD_NAME                0 (set_a)
              +             54 LOAD_ATTR                3 (update)
              +             57 LOAD_CONST               2 (3)
              +             60 BUILD_SET                1
              +             63 CALL_FUNCTION            1
              +             66 POP_TOP
              +
              +  6          67 LOAD_NAME                0 (set_a)
              +             70 LOAD_ATTR                4 (union)
              +             73 LOAD_CONST               0 (1)
              +             76 LOAD_CONST               4 (5)
              +             79 BUILD_SET                2
              +             82 CALL_FUNCTION            1
              +             85 POP_TOP
              +             86 LOAD_CONST               5 (None)
              +             89 RETURN_VALUE
              +
              +

              通过该字节码指令可知,创建 set 调用了 BUILD_SET 指令,初始化完成之后,就调用 set 的 add 方法添加元素,调用 remove 删除元素,调用 update 来更新集合,通过 union 来合并集合。接下来就详细分析一下相关的操作流程。

              +

              set 的创建与初始化

              +

              查找 BUILD_SET 的虚拟机执行函数如下;

              +

              源文件:Python/ceval.c

              +
              // Python/ceval.c
              +
              +    TARGET(BUILD_SET) {
              +        PyObject *set = PySet_New(NULL);             // 新建并初始化一个set
              +        int err = 0;
              +        int i;
              +        if (set == NULL)
              +            goto error;
              +        for (i = oparg; i > 0; i--) {                // 将传入初始化的参数传入
              +            PyObject *item = PEEK(i);
              +            if (err == 0)
              +                err = PySet_Add(set, item);          // 并依次对set进行添加操作
              +            Py_DECREF(item);
              +        }
              +        STACKADJ(-oparg);                  // 移动弹栈
              +        if (err != 0) {
              +            Py_DECREF(set);
              +            goto error;
              +        }
              +        PUSH(set);                     // 讲set压栈
              +        DISPATCH();                    // 执行下一条指令
              +    }
              +
              +

              此时继续查看 PySet_New 函数的执行流程;

              +

              源文件:Objects/setobject.c

              +
              PyObject *
              +PySet_New(PyObject *iterable)
              +{
              +    return make_new_set(&PySet_Type, iterable);
              +}
              +
              +...
              +
              +
              +static PyObject *
              +make_new_set(PyTypeObject *type, PyObject *iterable)
              +{
              +    PySetObject *so;
              +
              +    so = (PySetObject *)type->tp_alloc(type, 0);            // 申请该元素的内存
              +    if (so == NULL)                                        // 内存申请失败则返回为空
              +        return NULL;
              +
              +    so->fill = 0;                                           // 初始化的时候都为0
              +    so->used = 0;
              +    so->mask = PySet_MINSIZE - 1;                           // PySet_MINSIZE默认我8,mask为7
              +    so->table = so->smalltable;                             // 将保存数据的头指针指向table
              +    so->hash = -1;                                          // 设置hash值为-1
              +    so->finger = 0;
              +    so->weakreflist = NULL;
              +
              +    if (iterable != NULL) {                                 // 如果有迭代器
              +        if (set_update_internal(so, iterable)) {            // 将内容更新到so中
              +            Py_DECREF(so);
              +            return NULL;
              +        }
              +    }
              +
              +    return (PyObject *)so;                                  // 返回初始化完成的set
              +}
              +
              +

              从 PySet_New 的执行流程可知,字典的初始化过程就是初始化相关数据结构。

              +

              set 的插入

              +

              在本例的初始化过程中,由于传入了初始值 1,2,所以会在执行字节码指令的时候,执行 PySet_Add,该函数的本质与 set_a.add(3)本质都调用了更底层 set_add_key 函数;

              +

              源文件:Objects/setobject.c

              +
              
              +int
              +PySet_Add(PyObject *anyset, PyObject *key)
              +{
              +    if (!PySet_Check(anyset) &&
              +        (!PyFrozenSet_Check(anyset) || Py_REFCNT(anyset) != 1)) {
              +        PyErr_BadInternalCall();
              +        return -1;
              +    }
              +    return set_add_key((PySetObject *)anyset, key);  // 向字典中添加key;
              +}
              +
              +

              继续查看 set_add_key 函数的执行过程;

              +

              源文件:Objects/setobject.c

              +
              static int
              +set_add_key(PySetObject *so, PyObject *key)
              +{
              +    Py_hash_t hash;
              +
              +    if (!PyUnicode_CheckExact(key) ||
              +        (hash = ((PyASCIIObject *) key)->hash) == -1) {
              +        hash = PyObject_Hash(key);                  // 获取传入值的hash值
              +        if (hash == -1)                             // 如果不能hash则返回-1
              +            return -1;
              +    }
              +    return set_add_entry(so, key, hash);            // 计算完成后添加值
              +}
              +
              +

              该函数主要就是检查传入的 key 是否能够被 hash,如果能够被 hash 则直接返回,如果能被 hash 则继续调用 set_add_entry 函数将值加入到 set 中;

              +

              源文件:Objects/setobject.c

              +
              
              +static int
              +set_add_entry(PySetObject *so, PyObject *key, Py_hash_t hash)
              +{
              +    setentry *table;
              +    setentry *freeslot;
              +    setentry *entry;
              +    size_t perturb;
              +    size_t mask;
              +    size_t i;                       /* Unsigned for defined overflow behavior */
              +    size_t j;
              +    int cmp;
              +
              +    /* Pre-increment is necessary to prevent arbitrary code in the rich
              +       comparison from deallocating the key just before the insertion. */
              +    Py_INCREF(key);                                                             // 提高key的引用计数
              +
              +  restart:
              +
              +    mask = so->mask;                                                           // 获取so->mask
              +    i = (size_t)hash & mask;                                                   // 通过传入的hash与mask求索引下标
              +
              +    entry = &so->table[i];                                                    // 获取索引对应的值
              +    if (entry->key == NULL)                                                     // 如果获取索引的值没有被使用则直接跳转到found_unused处执行
              +        goto found_unused;
              +
              +    freeslot = NULL;
              +    perturb = hash;                                                           // perturb设置为当前hash值
              + 
              +    while (1) {
              +        if (entry->hash == hash) {                                              // 如果当前hash值相等
              +            PyObject *startkey = entry->key;                      // 获取当前key
              +            /* startkey cannot be a dummy because the dummy hash field is -1 */
              +            assert(startkey != dummy);                                          // 检查key是否为dummy
              +            if (startkey == key)                                                // 如果找到的值与传入需要设置的值相同则跳转到found_active处执行
              +                goto found_active;
              +            if (PyUnicode_CheckExact(startkey)
              +                && PyUnicode_CheckExact(key)
              +                && _PyUnicode_EQ(startkey, key))                                // 如果是unicode,通过类型转换检查两个key的内容是否相同,如果不相同则跳转到found_active处
              +                goto found_active;
              +            table = so->table;                                                  // 如果没有找到,则获取当前table的头部节点
              +            Py_INCREF(startkey);
              +            cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);          // 如果是其他类型的对象则调用比较方法去比较两个key是否相同
              +            Py_DECREF(startkey);
              +            if (cmp > 0)                                          /* likely */   // 如果找到则跳转到found_active
              +                goto found_active;
              +            if (cmp < 0)
              +                goto comparison_error;                                          // 如果小于0,则是两个类型对比失败
              +            /* Continuing the search from the current entry only makes
              +               sense if the table and entry are unchanged; otherwise,
              +               we have to restart from the beginning */
              +            if (table != so->table || entry->key != startkey)                     // 如果set改变了则重新开始查找
              +                goto restart;
              +            mask = so->mask;                 /* help avoid a register spill */   
              +        }
              +        else if (entry->hash == -1)
              +            freeslot = entry;                                                   // 如果不能hash 则设置freeslot
              +
              +        if (i + LINEAR_PROBES <= mask) {                                 // 检查当前索引值加上 9小于当前mask
              +            for (j = 0 ; j < LINEAR_PROBES ; j++) {                               // 循环9次
              +                entry++;                                                        // 向下一个位置
              +                if (entry->hash == 0 && entry->key == NULL)              // 如果找到当前hash为空或者key为空的则跳转到found_unused_or_dummy处执行
              +                    goto found_unused_or_dummy;
              +                if (entry->hash == hash) {                                       // 如果找到的hash值相同
              +                    PyObject *startkey = entry->key;                              // 获取该值
              +                    assert(startkey != dummy);                                    // 检查是否为dummy
              +                    if (startkey == key)                                          // 如果key相同则跳转到found_active处执行
              +                        goto found_active;
              +                    if (PyUnicode_CheckExact(startkey)
              +                        && PyUnicode_CheckExact(key)
              +                        && _PyUnicode_EQ(startkey, key))                          // 检查是否为unicode,并比较如果不相同则跳转到found_active
              +                        goto found_active;
              +                    table = so->table;                                            // 调用key本身的方法比较
              +                    Py_INCREF(startkey);
              +                    cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
              +                    Py_DECREF(startkey);
              +                    if (cmp > 0)
              +                        goto found_active;
              +                    if (cmp < 0)
              +                        goto comparison_error;
              +                    if (table != so->table || entry->key != startkey)
              +                        goto restart;
              +                    mask = so->mask;
              +                }
              +                else if (entry->hash == -1)
              +                    freeslot = entry;
              +            }
              +        }
              +
              +        perturb >>= PERTURB_SHIFT;                                               // 如果没有找到则获取下一个索引值
              +        i = (i * 5 + 1 + perturb) & mask;                                        // 右移5位 加上 索引值*5 加1与mask求余获取下一个索引值
              +
              +        entry = &so->table[i];                                                   // 获取下一个元素
              +        if (entry->key == NULL)                                         // 如果找到为空则直接跳转到found_unused_or_dummy处
              +            goto found_unused_or_dummy;
              +    }
              +
              +  found_unused_or_dummy:
              +    if (freeslot == NULL)                                  // 检查freeslot是否为空如果为空则跳转到found_unused处执行即找到了dummy位置
              +        goto found_unused;
              +    so->used++;                                                   // 使用数加1
              +    freeslot->key = key;                                   // 设置key与hash值
              +    freeslot->hash = hash;
              +    return 0;
              +
              +  found_unused:
              +    so->fill++;                                        // 使用总数加1
              +    so->used++;                                        // 使用总数加1 
              +    entry->key = key;                                     // 设置key与hash值
              +    entry->hash = hash;
              +    if ((size_t)so->fill*5 < mask*3)                           // 检查已经使用的值是否是总数的3/5
              +        return 0;
              +    return set_table_resize(so, so->used>50000 ? so->used*2 : so->used*4);    // 如果已使用的总数大于3/5则重新调整table,如果set使用的总数超过了50000则扩展为以前的2倍否则就是四倍
              +
              +  found_active:
              +    Py_DECREF(key);                                      // 如果找到了该值 则什么也不做
              +    return 0;
              +
              +  comparison_error:
              +    Py_DECREF(key);                                      // 如果比较失败则返回-1
              +    return -1;
              +}
              +
              +

              此时基本的流程就是通过传入的 hash 值,如果计算出的索引值,没有值,则直接将该值存入对应的 entry 中,如果相同则不插入,如果索引对应的值且值不同,则遍历从该索引往后9个位置的值,依次找到有空余位置的值,并将该值设置进去。如果设置该值之后使用的数量占总的申请数量超过了 3/5 则重新扩充 set,扩充的原则就是如果当前的 set->used>50000 就进行两倍扩充否则就进行四倍扩充。

              +

              插入的概述如下,默认 s 初始化为空;

              +
              s.add(1)   // index = 1 & 7 = 1
              +
              +

              插入1

              +
              s.add(2) // index = 2 & 7 = 2
              +
              +

              插入2

              +
              s.add(7)  // index = 9 & 7 = 1
              +
              +

              插入9

              +

              大致的 set 的插入过程执行完毕。

              +

              set 的删除

              +

              set 的删除操作主要集中在 set_remove()函数上,如下示例;

              +

              源文件:Objects/setobject.c

              +
              
              +static PyObject *
              +set_remove(PySetObject *so, PyObject *key)
              +{
              +    PyObject *tmpkey;
              +    int rv;
              +
              +    rv = set_discard_key(so, key);                              // 将该key设置为dummy
              +    if (rv < 0) {
              +        if (!PySet_Check(key) || !PyErr_ExceptionMatches(PyExc_TypeError))  // 检查是否为set类型
              +            return NULL;
              +        PyErr_Clear();
              +        tmpkey = make_new_set(&PyFrozenSet_Type, key);             // 对该值重新初始化为forzenset
              +        if (tmpkey == NULL)
              +            return NULL;
              +        rv = set_discard_key(so, tmpkey);                     // 设置该key为空
              +        Py_DECREF(tmpkey);
              +        if (rv < 0)
              +            return NULL;
              +    }
              +
              +    if (rv == DISCARD_NOTFOUND) {                               // 如果没有找到则报错
              +        _PyErr_SetKeyError(key);
              +        return NULL;
              +    }
              +    Py_RETURN_NONE;
              +}
              +
              +

              此时就会调用 set_discard_key 方法来讲对应的 entry 设置为 dummy;set_discard_key 方法如下;

              +

              源文件:Objects/setobject.c

              +
              
              +static int
              +set_discard_key(PySetObject *so, PyObject *key)
              +{
              +    Py_hash_t hash;
              +
              +    if (!PyUnicode_CheckExact(key) ||
              +        (hash = ((PyASCIIObject *) key)->hash) == -1) {
              +        hash = PyObject_Hash(key);                         // 检查是否可用hash如果可用则调用set_discard_entry方法
              +        if (hash == -1)
              +            return -1;
              +    }
              +    return set_discard_entry(so, key, hash);
              +}
              +
              +

              该函数主要就是做了检查 key 是否可用 hash 的检查,此时如果可用 hash 则调用 set_discard_entry 方法;

              +

              源文件:Objects/setobject.c

              +
              
              +static int
              +set_discard_entry(PySetObject *so, PyObject *key, Py_hash_t hash)
              +{
              +    setentry *entry;
              +    PyObject *old_key;
              +
              +    entry = set_lookkey(so, key, hash);      // 查找该值 set_lookkey该方法与插入的逻辑类似大家可自行查看
              +    if (entry == NULL)                 // 如果没有找到则返回-1
              +        return -1;
              +    if (entry->key == NULL)
              +        return DISCARD_NOTFOUND;           // 找到entry而key为空则返回notfound
              +    old_key = entry->key;                        // 找到正常值则讲该值对应的entry设置为dummy
              +    entry->key = dummy;
              +    entry->hash = -1;                             // hash值为-1
              +    so->used--;                                   // 使用数量减1 但是fill数量未变
              +    Py_DECREF(old_key);                 // 减少该对象引用
              +    return DISCARD_FOUND;                // 返回返现
              +}
              +
              +

              此时就是查找该值,如果找到该值并将该值设置为 dummy,并且将 used 值减1,此处没有减去 fill 的数量,从此处可知,fill 包括所有曾经申请过的数量。

              +

              set 的 resize

              +

              set 的 resize 主要依靠 set_table_reseize 函数来实现;

              +

              源文件:Objects/setobject.c

              +
              static int
              +set_table_resize(PySetObject *so, Py_ssize_t minused)
              +{
              +    setentry *oldtable, *newtable, *entry;
              +    Py_ssize_t oldmask = so->mask;                                            // 设置旧的mask
              +    size_t newmask;
              +    int is_oldtable_malloced;
              +    setentry small_copy[PySet_MINSIZE];                                       // 最小的拷贝数组
              +
              +    assert(minused >= 0);
              +
              +    /* Find the smallest table size > minused. */
              +    /* XXX speed-up with intrinsics */
              +    size_t newsize = PySet_MINSIZE;
              +    while (newsize <= (size_t)minused) {
              +        newsize <<= 1; // The largest possible value is PY_SSIZE_T_MAX + 1.  // 查找位于minused最大的PySet_MINSIZE的n次方的值
              +    }
              +
              +    /* Get space for a new table. */
              +    oldtable = so->table;                            // 先获取旧的table
              +    assert(oldtable != NULL);
              +    is_oldtable_malloced = oldtable != so->smalltable;
              +
              +    if (newsize == PySet_MINSIZE) {                  // 如果获取的新大小与PySet_MINSIZE的大小相同
              +        /* A large table is shrinking, or we can't get any smaller. */
              +        newtable = so->smalltable;                  // 获取新table的地址
              +        if (newtable == oldtable) {                 // 如果相同
              +            if (so->fill == so->used) {              // 如果使用的相同则什么都不做
              +                /* No dummies, so no point doing anything. */
              +                return 0;
              +            }
              +            /* We're not going to resize it, but rebuild the
              +               table anyway to purge old dummy entries.
              +               Subtle:  This is *necessary* if fill==size,
              +               as set_lookkey needs at least one virgin slot to
              +               terminate failing searches.  If fill < size, it's
              +               merely desirable, as dummies slow searches. */
              +            assert(so->fill > so->used);
              +            memcpy(small_copy, oldtable, sizeof(small_copy)); // 将数据拷贝到set_lookkey中
              +            oldtable = small_copy;                  
              +        }
              +    }
              +    else {
              +        newtable = PyMem_NEW(setentry, newsize);                 // 新申请内存
              +        if (newtable == NULL) {                     // 如果为空则申请内存失败报错
              +            PyErr_NoMemory();
              +            return -1;
              +        }
              +    }
              +
              +    /* Make the set empty, using the new table. */
              +    assert(newtable != oldtable);                                // 检查新申请的与就table不同
              +    memset(newtable, 0, sizeof(setentry) * newsize);        // 新申请的内存置空
              +    so->mask = newsize - 1;                                     // 设置新的size
              +    so->table = newtable;                                       // 重置table指向新table
              +
              +    /* Copy the data over; this is refcount-neutral for active entries;
              +       dummy entries aren't copied over, of course */
              +    newmask = (size_t)so->mask;                                  // 获取新的mask
              +    if (so->fill == so->used) {                                  // 如果使用的与曾经使用的数量相同
              +        for (entry = oldtable; entry <= oldtable + oldmask; entry++) {
              +            if (entry->key != NULL) {
              +                set_insert_clean(newtable, newmask, entry->key, entry->hash);  // 如果值不为空则插入到新的table中
              +            }
              +        }
              +    } else {
              +        so->fill = so->used;                        // 如果不相同则重置fill为used的值
              +        for (entry = oldtable; entry <= oldtable + oldmask; entry++) {
              +            if (entry->key != NULL && entry->key != dummy) {     // 检查如果不为dummy并且key不为空的情况下
              +                set_insert_clean(newtable, newmask, entry->key, entry->hash);  // 重新插入该列表该值
              +            }
              +        }
              +    }
              +
              +    if (is_oldtable_malloced)                       // 如果两个表相同则删除旧table
              +        PyMem_DEL(oldtable);
              +    return 0;                                                      // 返回0
              +}
              +
              +

              主要是检查是否 table 相同并且需要重新 resize 的值,然后判断是否 fill 与 used 相同,如果相同则全部插入,如果不同,则遍历旧 table 讲不为空并且不为 dummy 的值插入到新表中;

              +

              源文件:Objects/setobject.c

              +
              static void
              +set_insert_clean(setentry *table, size_t mask, PyObject *key, Py_hash_t hash)
              +{
              +    setentry *entry;
              +    size_t perturb = hash;
              +    size_t i = (size_t)hash & mask;                // 计算索引
              +    size_t j;
              +
              +    while (1) {
              +        entry = &table[i];                              // 获取当前entry
              +        if (entry->key == NULL)                         // 如果为空则跳转值found_null设置key与hash
              +            goto found_null;
              +        if (i + LINEAR_PROBES <= mask) {                // 如果没有找到空值则通过该索引偏移9位去查找空余位置
              +            for (j = 0; j < LINEAR_PROBES; j++) {
              +                entry++;
              +                if (entry->key == NULL)                 // 如果为空则跳转到found_null
              +                    goto found_null;
              +            }
              +        }
              +        perturb >>= PERTURB_SHIFT;                      // 计算下一个索引值继续寻找
              +        i = (i * 5 + 1 + perturb) & mask;
              +    }
              +  found_null:
              +    entry->key = key;
              +    entry->hash = hash;
              +}
              +
              +

              set 的 resize 的操作基本如上所述。

              +
              Copyright © FlagGo 2019 all right reserved,powered by Gitbook该文件修订时间: +2020-03-23 19:36:27 +
              + +
              + +
              +
              +
              + +

              results matching ""

              +
                + +
                +
                + +

                No results matching ""

                + +
                +
                +
                + +
                +
                + +
                + + + + + + + + + + + + + + +
                + + +
                + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/objects/set-object/index.md b/objects/set-object/index.md deleted file mode 100644 index 74bbcd7..0000000 --- a/objects/set-object/index.md +++ /dev/null @@ -1,593 +0,0 @@ -# python 集合 - -set 是无序且不重复的集合,是可变的,通常用来从列表中删除重复项以及计算数学运算,如交集、并集、差分和对称差分等集合操作。set 支持 x in set, len(set),和 for x in set。作为一个无序的集合,set 不记录元素位置或者插入点。因此,sets 不支持 indexing, 或其它类序列的操作。 - -## python 集合概述 - -在 set 中,对应的 set 的值的存储是通过结构 setentry 来保存数据值的; - -`源文件:`[include/setobject.h](https://github.com/python/cpython/blob/1bf9cc509326bc42cd8cb1650eb9bf64550d817e/Include/setobject.h#L26) - -```c -typedef struct { - PyObject *key; - Py_hash_t hash; /* Cached hash code of the key */ -} setentry; -``` - -key 就是保存的数据,hash 就是保存的数据的 hash,便于查找,set 也是基于 hash 表来实现。对应的 setentry 所对应的 set 的数据结构如下; - -`源文件:`[include/setobject.h](https://github.com/python/cpython/blob/1bf9cc509326bc42cd8cb1650eb9bf64550d817e/Include/setobject.h#L42) - -```c -typedef struct { - PyObject_HEAD - - Py_ssize_t fill; /* Number active and dummy entries*/ // 包括已经使用的entry与空entry值的总和 - Py_ssize_t used; /* Number active entries */ // 已经使用可用的总量 - - /* The table contains mask + 1 slots, and that's a power of 2. - * We store the mask instead of the size because the mask is more - * frequently needed. - */ - Py_ssize_t mask;                                // 与hash求和的mask - - /* The table points to a fixed-size smalltable for small tables - * or to additional malloc'ed memory for bigger tables. - * The table pointer is never NULL which saves us from repeated - * runtime null-tests. - */ - setentry *table; // 保存数据的数组数组指针 - Py_hash_t hash; /* Only used by frozenset objects */ - Py_ssize_t finger; /* Search finger for pop() */ - - setentry smalltable[PySet_MINSIZE]; // 保存数据的数组 默认初始化为8个元素,通过table指向 - PyObject *weakreflist; /* List of weak references */ -} PySetObject; -``` - -一个 set 就对应一个 PySetObject 类型数据,set 会根据保存的元素自动调整大小。相关的内存布局如下; - -![内存图片](set.png) - -## python 集合(set)示例 - -示例脚本如下: - -```python -set_a = {1,2}  -set_a.add(3) -set_a.add(4) -set_a.remove(1) -set_a.update({3,}) -set_a.union({1,5}) -``` - -通过 python 反汇编获取该脚本的字节码; - -``` -python -m dis set_test.py -``` - -输出的字节码如下所示; - -```shell - 1 0 LOAD_CONST 0 (1) - 3 LOAD_CONST 1 (2) - 6 BUILD_SET 2 - 9 STORE_NAME 0 (set_a) - - 2 12 LOAD_NAME 0 (set_a) - 15 LOAD_ATTR 1 (add) - 18 LOAD_CONST 2 (3) - 21 CALL_FUNCTION 1 - 24 POP_TOP - - 3 25 LOAD_NAME 0 (set_a) - 28 LOAD_ATTR 1 (add) - 31 LOAD_CONST 3 (4) - 34 CALL_FUNCTION 1 - 37 POP_TOP - - 4 38 LOAD_NAME 0 (set_a) - 41 LOAD_ATTR 2 (remove) - 44 LOAD_CONST 0 (1) - 47 CALL_FUNCTION 1 - 50 POP_TOP - - 5 51 LOAD_NAME 0 (set_a) - 54 LOAD_ATTR 3 (update) - 57 LOAD_CONST 2 (3) - 60 BUILD_SET 1 - 63 CALL_FUNCTION 1 - 66 POP_TOP - - 6 67 LOAD_NAME 0 (set_a) - 70 LOAD_ATTR 4 (union) - 73 LOAD_CONST 0 (1) - 76 LOAD_CONST 4 (5) - 79 BUILD_SET 2 - 82 CALL_FUNCTION 1 - 85 POP_TOP - 86 LOAD_CONST 5 (None) - 89 RETURN_VALUE -``` - -通过该字节码指令可知,创建 set 调用了 BUILD_SET 指令,初始化完成之后,就调用 set 的 add 方法添加元素,调用 remove 删除元素,调用 update 来更新集合,通过 union 来合并集合。接下来就详细分析一下相关的操作流程。 - -## set 的创建与初始化 - -查找 BUILD_SET 的虚拟机执行函数如下; - -`源文件:`[Python/ceval.c](https://github.com/python/cpython/blob/1bf9cc509326bc42cd8cb1650eb9bf64550d817e/Python/ceval.c#L2318) - -```c -// Python/ceval.c - - TARGET(BUILD_SET) { - PyObject *set = PySet_New(NULL); // 新建并初始化一个set - int err = 0; - int i; - if (set == NULL) - goto error; - for (i = oparg; i > 0; i--) { // 将传入初始化的参数传入 - PyObject *item = PEEK(i); - if (err == 0) - err = PySet_Add(set, item); // 并依次对set进行添加操作 - Py_DECREF(item); - } - STACKADJ(-oparg);                // 移动弹栈 - if (err != 0) { - Py_DECREF(set); - goto error; - } - PUSH(set);                     // 讲set压栈 - DISPATCH();                    // 执行下一条指令 - } - -``` - -此时继续查看 PySet_New 函数的执行流程; - -`源文件:`[Objects/setobject.c](https://github.com/python/cpython/blob/1bf9cc509326bc42cd8cb1650eb9bf64550d817e/Objects/setobject.c#L2286) - -```c -PyObject * -PySet_New(PyObject *iterable) -{ - return make_new_set(&PySet_Type, iterable); -} - -... - - -static PyObject * -make_new_set(PyTypeObject *type, PyObject *iterable) -{ - PySetObject *so; - - so = (PySetObject *)type->tp_alloc(type, 0); // 申请该元素的内存 - if (so == NULL) // 内存申请失败则返回为空 - return NULL; - - so->fill = 0; // 初始化的时候都为0 - so->used = 0; - so->mask = PySet_MINSIZE - 1; // PySet_MINSIZE默认我8,mask为7 - so->table = so->smalltable; // 将保存数据的头指针指向table - so->hash = -1; // 设置hash值为-1 - so->finger = 0; - so->weakreflist = NULL; - - if (iterable != NULL) { // 如果有迭代器 - if (set_update_internal(so, iterable)) { // 将内容更新到so中 - Py_DECREF(so); - return NULL; - } - } - - return (PyObject *)so; // 返回初始化完成的set -} -``` - -从 PySet_New 的执行流程可知,字典的初始化过程就是初始化相关数据结构。 - -## set 的插入 - -在本例的初始化过程中,由于传入了初始值 1,2,所以会在执行字节码指令的时候,执行 PySet_Add,该函数的本质与 set_a.add(3)本质都调用了更底层 set_add_key 函数; - -`源文件:`[Objects/setobject.c](https://github.com/python/cpython/blob/1bf9cc509326bc42cd8cb1650eb9bf64550d817e/Objects/setobject.c#L2338) - -```c - -int -PySet_Add(PyObject *anyset, PyObject *key) -{ - if (!PySet_Check(anyset) && - (!PyFrozenSet_Check(anyset) || Py_REFCNT(anyset) != 1)) { - PyErr_BadInternalCall(); - return -1; - } - return set_add_key((PySetObject *)anyset, key); // 向字典中添加key; -} -``` - -继续查看 set_add_key 函数的执行过程; - -`源文件:`[Objects/setobject.c](https://github.com/python/cpython/blob/1bf9cc509326bc42cd8cb1650eb9bf64550d817e/Objects/setobject.c#L419) - -```c -static int -set_add_key(PySetObject *so, PyObject *key) -{ - Py_hash_t hash; - - if (!PyUnicode_CheckExact(key) || - (hash = ((PyASCIIObject *) key)->hash) == -1) { - hash = PyObject_Hash(key); // 获取传入值的hash值 - if (hash == -1) // 如果不能hash则返回-1 - return -1; - } - return set_add_entry(so, key, hash); // 计算完成后添加值 -} -``` - -该函数主要就是检查传入的 key 是否能够被 hash,如果能够被 hash 则直接返回,如果能被 hash 则继续调用 set_add_entry 函数将值加入到 set 中; - -`源文件:`[Objects/setobject.c](https://github.com/python/cpython/blob/1bf9cc509326bc42cd8cb1650eb9bf64550d817e/Objects/setobject.c#L136) - -```c - -static int -set_add_entry(PySetObject *so, PyObject *key, Py_hash_t hash) -{ - setentry *table; - setentry *freeslot; - setentry *entry; - size_t perturb; - size_t mask; - size_t i; /* Unsigned for defined overflow behavior */ - size_t j; - int cmp; - - /* Pre-increment is necessary to prevent arbitrary code in the rich - comparison from deallocating the key just before the insertion. */ - Py_INCREF(key); // 提高key的引用计数 - - restart: - - mask = so->mask;  // 获取so->mask - i = (size_t)hash & mask;  // 通过传入的hash与mask求索引下标 - - entry = &so->table[i];    // 获取索引对应的值 - if (entry->key == NULL) // 如果获取索引的值没有被使用则直接跳转到found_unused处执行 - goto found_unused; - - freeslot = NULL; - perturb = hash;    // perturb设置为当前hash值 -  - while (1) { - if (entry->hash == hash) { // 如果当前hash值相等 - PyObject *startkey = entry->key;                      // 获取当前key - /* startkey cannot be a dummy because the dummy hash field is -1 */ - assert(startkey != dummy); // 检查key是否为dummy - if (startkey == key) // 如果找到的值与传入需要设置的值相同则跳转到found_active处执行 - goto found_active; - if (PyUnicode_CheckExact(startkey) - && PyUnicode_CheckExact(key) - && _PyUnicode_EQ(startkey, key)) // 如果是unicode,通过类型转换检查两个key的内容是否相同,如果不相同则跳转到found_active处 - goto found_active; - table = so->table; // 如果没有找到,则获取当前table的头部节点 - Py_INCREF(startkey); - cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);          // 如果是其他类型的对象则调用比较方法去比较两个key是否相同 - Py_DECREF(startkey); - if (cmp > 0) /* likely */ // 如果找到则跳转到found_active - goto found_active; - if (cmp < 0) - goto comparison_error; // 如果小于0,则是两个类型对比失败 - /* Continuing the search from the current entry only makes - sense if the table and entry are unchanged; otherwise, - we have to restart from the beginning */ - if (table != so->table || entry->key != startkey) // 如果set改变了则重新开始查找 - goto restart; - mask = so->mask; /* help avoid a register spill */    - } - else if (entry->hash == -1) - freeslot = entry;    // 如果不能hash 则设置freeslot - - if (i + LINEAR_PROBES <= mask) {               // 检查当前索引值加上 9小于当前mask - for (j = 0 ; j < LINEAR_PROBES ; j++) { // 循环9次 - entry++;     // 向下一个位置 - if (entry->hash == 0 && entry->key == NULL)              // 如果找到当前hash为空或者key为空的则跳转到found_unused_or_dummy处执行 - goto found_unused_or_dummy; - if (entry->hash == hash) {   // 如果找到的hash值相同 - PyObject *startkey = entry->key; // 获取该值 - assert(startkey != dummy); // 检查是否为dummy - if (startkey == key) // 如果key相同则跳转到found_active处执行 - goto found_active; - if (PyUnicode_CheckExact(startkey) - && PyUnicode_CheckExact(key) - && _PyUnicode_EQ(startkey, key)) // 检查是否为unicode,并比较如果不相同则跳转到found_active - goto found_active; - table = so->table; // 调用key本身的方法比较 - Py_INCREF(startkey); - cmp = PyObject_RichCompareBool(startkey, key, Py_EQ); - Py_DECREF(startkey); - if (cmp > 0) - goto found_active; - if (cmp < 0) - goto comparison_error; - if (table != so->table || entry->key != startkey) - goto restart; - mask = so->mask; - } - else if (entry->hash == -1) - freeslot = entry; - } - } - - perturb >>= PERTURB_SHIFT; // 如果没有找到则获取下一个索引值 - i = (i * 5 + 1 + perturb) & mask; // 右移5位 加上 索引值*5 加1与mask求余获取下一个索引值 - - entry = &so->table[i]; // 获取下一个元素 - if (entry->key == NULL)               // 如果找到为空则直接跳转到found_unused_or_dummy处 - goto found_unused_or_dummy; - } - - found_unused_or_dummy: - if (freeslot == NULL)                                  // 检查freeslot是否为空如果为空则跳转到found_unused处执行即找到了dummy位置 - goto found_unused; - so->used++;                       // 使用数加1 - freeslot->key = key;                                   // 设置key与hash值 - freeslot->hash = hash; - return 0; - - found_unused: - so->fill++;                                        // 使用总数加1 - so->used++;                                        // 使用总数加1  - entry->key = key;                                     // 设置key与hash值 - entry->hash = hash; - if ((size_t)so->fill*5 < mask*3)                           // 检查已经使用的值是否是总数的3/5 - return 0; - return set_table_resize(so, so->used>50000 ? so->used*2 : so->used*4);    // 如果已使用的总数大于3/5则重新调整table,如果set使用的总数超过了50000则扩展为以前的2倍否则就是四倍 - - found_active: - Py_DECREF(key);                                      // 如果找到了该值 则什么也不做 - return 0; - - comparison_error: - Py_DECREF(key);                                      // 如果比较失败则返回-1 - return -1; -} -``` - -此时基本的流程就是通过传入的 hash 值,如果计算出的索引值,没有值,则直接将该值存入对应的 entry 中,如果相同则不插入,如果索引对应的值且值不同,则遍历从该索引往后9个位置的值,依次找到有空余位置的值,并将该值设置进去。如果设置该值之后使用的数量占总的申请数量超过了 3/5 则重新扩充 set,扩充的原则就是如果当前的 set->used>50000 就进行两倍扩充否则就进行四倍扩充。 - -插入的概述如下,默认 s 初始化为空; - -```python -s.add(1) // index = 1 & 7 = 1 -``` - -![插入1](set-insert-one.png) - -```python -s.add(2) // index = 2 & 7 = 2 -``` - -![插入2](set-insert-two.png) - -```python -s.add(7) // index = 9 & 7 = 1 -``` - -![插入9](set-insert-nine.png) - -大致的 set 的插入过程执行完毕。 - -## set 的删除 - -set 的删除操作主要集中在 set_remove()函数上,如下示例; - -`源文件:`[Objects/setobject.c](https://github.com/python/cpython/blob/1bf9cc509326bc42cd8cb1650eb9bf64550d817e/Objects/setobject.c#L1921) - -```c - -static PyObject * -set_remove(PySetObject *so, PyObject *key) -{ - PyObject *tmpkey; - int rv; - - rv = set_discard_key(so, key); // 将该key设置为dummy - if (rv < 0) { - if (!PySet_Check(key) || !PyErr_ExceptionMatches(PyExc_TypeError)) // 检查是否为set类型 - return NULL; - PyErr_Clear(); - tmpkey = make_new_set(&PyFrozenSet_Type, key);             // 对该值重新初始化为forzenset - if (tmpkey == NULL) - return NULL; - rv = set_discard_key(so, tmpkey);                     // 设置该key为空 - Py_DECREF(tmpkey); - if (rv < 0) - return NULL; - } - - if (rv == DISCARD_NOTFOUND) { // 如果没有找到则报错 - _PyErr_SetKeyError(key); - return NULL; - } - Py_RETURN_NONE; -} -``` - -此时就会调用 set_discard_key 方法来讲对应的 entry 设置为 dummy;set_discard_key 方法如下; - -`源文件:`[Objects/setobject.c](https://github.com/python/cpython/blob/1bf9cc509326bc42cd8cb1650eb9bf64550d817e/Objects/setobject.c#L447) - -```c - -static int -set_discard_key(PySetObject *so, PyObject *key) -{ - Py_hash_t hash; - - if (!PyUnicode_CheckExact(key) || - (hash = ((PyASCIIObject *) key)->hash) == -1) { - hash = PyObject_Hash(key);  // 检查是否可用hash如果可用则调用set_discard_entry方法 - if (hash == -1) - return -1; - } - return set_discard_entry(so, key, hash); -} -``` - -该函数主要就是做了检查 key 是否可用 hash 的检查,此时如果可用 hash 则调用 set_discard_entry 方法; - -`源文件:`[Objects/setobject.c](https://github.com/python/cpython/blob/1bf9cc509326bc42cd8cb1650eb9bf64550d817e/Objects/setobject.c#L400) - -```c - -static int -set_discard_entry(PySetObject *so, PyObject *key, Py_hash_t hash) -{ - setentry *entry; - PyObject *old_key; - - entry = set_lookkey(so, key, hash);      // 查找该值 set_lookkey该方法与插入的逻辑类似大家可自行查看 - if (entry == NULL)                 // 如果没有找到则返回-1 - return -1; - if (entry->key == NULL) - return DISCARD_NOTFOUND;           // 找到entry而key为空则返回notfound - old_key = entry->key; // 找到正常值则讲该值对应的entry设置为dummy - entry->key = dummy; - entry->hash = -1; // hash值为-1 - so->used--; // 使用数量减1 但是fill数量未变 - Py_DECREF(old_key);                 // 减少该对象引用 - return DISCARD_FOUND;                // 返回返现 -} -``` - -此时就是查找该值,如果找到该值并将该值设置为 dummy,并且将 used 值减1,此处没有减去 fill 的数量,从此处可知,fill 包括所有曾经申请过的数量。 - -## set 的 resize - -set 的 resize 主要依靠 set_table_reseize 函数来实现; - -`源文件:`[Objects/setobject.c](https://github.com/python/cpython/blob/1bf9cc509326bc42cd8cb1650eb9bf64550d817e/Objects/setobject.c#L302) - -```c -static int -set_table_resize(PySetObject *so, Py_ssize_t minused) -{ - setentry *oldtable, *newtable, *entry; - Py_ssize_t oldmask = so->mask; // 设置旧的mask - size_t newmask; - int is_oldtable_malloced; - setentry small_copy[PySet_MINSIZE]; // 最小的拷贝数组 - - assert(minused >= 0); - - /* Find the smallest table size > minused. */ - /* XXX speed-up with intrinsics */ - size_t newsize = PySet_MINSIZE; - while (newsize <= (size_t)minused) { - newsize <<= 1; // The largest possible value is PY_SSIZE_T_MAX + 1.  // 查找位于minused最大的PySet_MINSIZE的n次方的值 - } - - /* Get space for a new table. */ - oldtable = so->table;                   // 先获取旧的table - assert(oldtable != NULL); - is_oldtable_malloced = oldtable != so->smalltable; - - if (newsize == PySet_MINSIZE) {                  // 如果获取的新大小与PySet_MINSIZE的大小相同 - /* A large table is shrinking, or we can't get any smaller. */ - newtable = so->smalltable;                  // 获取新table的地址 - if (newtable == oldtable) {                 // 如果相同 - if (so->fill == so->used) {              // 如果使用的相同则什么都不做 - /* No dummies, so no point doing anything. */ - return 0; - } - /* We're not going to resize it, but rebuild the - table anyway to purge old dummy entries. - Subtle: This is *necessary* if fill==size, - as set_lookkey needs at least one virgin slot to - terminate failing searches. If fill < size, it's - merely desirable, as dummies slow searches. */ - assert(so->fill > so->used); - memcpy(small_copy, oldtable, sizeof(small_copy)); // 将数据拷贝到set_lookkey中 - oldtable = small_copy;                   - } - } - else { - newtable = PyMem_NEW(setentry, newsize); // 新申请内存 - if (newtable == NULL) {                     // 如果为空则申请内存失败报错 - PyErr_NoMemory(); - return -1; - } - } - - /* Make the set empty, using the new table. */ - assert(newtable != oldtable); // 检查新申请的与就table不同 - memset(newtable, 0, sizeof(setentry) * newsize);        // 新申请的内存置空 - so->mask = newsize - 1; // 设置新的size - so->table = newtable; // 重置table指向新table - - /* Copy the data over; this is refcount-neutral for active entries; - dummy entries aren't copied over, of course */ - newmask = (size_t)so->mask; // 获取新的mask - if (so->fill == so->used) { // 如果使用的与曾经使用的数量相同 - for (entry = oldtable; entry <= oldtable + oldmask; entry++) { - if (entry->key != NULL) { - set_insert_clean(newtable, newmask, entry->key, entry->hash);  // 如果值不为空则插入到新的table中 - } - } - } else { - so->fill = so->used;                        // 如果不相同则重置fill为used的值 - for (entry = oldtable; entry <= oldtable + oldmask; entry++) { - if (entry->key != NULL && entry->key != dummy) {     // 检查如果不为dummy并且key不为空的情况下 - set_insert_clean(newtable, newmask, entry->key, entry->hash);  // 重新插入该列表该值 - } - } - } - - if (is_oldtable_malloced)                       // 如果两个表相同则删除旧table - PyMem_DEL(oldtable); - return 0; // 返回0 -} - -``` - -主要是检查是否 table 相同并且需要重新 resize 的值,然后判断是否 fill 与 used 相同,如果相同则全部插入,如果不同,则遍历旧 table 讲不为空并且不为 dummy 的值插入到新表中; - -`源文件:`[Objects/setobject.c](https://github.com/python/cpython/blob/1bf9cc509326bc42cd8cb1650eb9bf64550d817e/Objects/setobject.c#L267) - -```c -static void -set_insert_clean(setentry *table, size_t mask, PyObject *key, Py_hash_t hash) -{ - setentry *entry; - size_t perturb = hash; - size_t i = (size_t)hash & mask;         // 计算索引 - size_t j; - - while (1) { - entry = &table[i]; // 获取当前entry - if (entry->key == NULL) // 如果为空则跳转值found_null设置key与hash - goto found_null; - if (i + LINEAR_PROBES <= mask) { // 如果没有找到空值则通过该索引偏移9位去查找空余位置 - for (j = 0; j < LINEAR_PROBES; j++) { - entry++; - if (entry->key == NULL) // 如果为空则跳转到found_null - goto found_null; - } - } - perturb >>= PERTURB_SHIFT; // 计算下一个索引值继续寻找 - i = (i * 5 + 1 + perturb) & mask; - } - found_null: - entry->key = key; - entry->hash = hash; -} -``` - -set 的 resize 的操作基本如上所述。 diff --git a/objects/simple-interpreter/index.html b/objects/simple-interpreter/index.html new file mode 100644 index 0000000..1d3a943 --- /dev/null +++ b/objects/simple-interpreter/index.html @@ -0,0 +1,474 @@ + + + + + + + 实现简版 Python · Python 3 源码分析 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                +
                + + + + + + + + +
                + +
                + +
                + + + + + + + + +
                +
                + +
                +
                + +
                + +

                Python 字符串 对象

                +
                Copyright © FlagGo 2019 all right reserved,powered by Gitbook该文件修订时间: +2020-03-23 19:36:27 +
                + +
                + +
                +
                +
                + +

                results matching ""

                +
                  + +
                  +
                  + +

                  No results matching ""

                  + +
                  +
                  +
                  + +
                  +
                  + +
                  + + + + + + + + + + +
                  + + +
                  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/objects/simple-interpreter/index.md b/objects/simple-interpreter/index.md deleted file mode 100644 index cb10692..0000000 --- a/objects/simple-interpreter/index.md +++ /dev/null @@ -1 +0,0 @@ -# Python 字符串 对象 diff --git a/package-lock.json b/package-lock.json index 9bee6b2..6fcf743 100644 --- a/package-lock.json +++ b/package-lock.json @@ -447,7 +447,7 @@ "delegate": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", - "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", + "integrity": "sha1-tmtxwxWFIuirV0T3INjKDCr1kWY=", "optional": true }, "delegates": { @@ -479,7 +479,7 @@ "domelementtype": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + "integrity": "sha1-0EjESzew0Qp/Kj1f7j9DM9eQSB8=" }, "domhandler": { "version": "2.3.0", @@ -505,7 +505,7 @@ "entities": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + "integrity": "sha1-vfpzUplmTfr9NFKe1PhSKidf6lY=" }, "es5-ext": { "version": "0.10.50", @@ -5002,7 +5002,7 @@ "gitbook-plugin-prism": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/gitbook-plugin-prism/-/gitbook-plugin-prism-2.4.0.tgz", - "integrity": "sha512-qt16TmNJA5SVpFF+4OhiaPf5VHg/aWj9QFuYEC/dUHmBgYbaq5HMwsqGFFXj4N/zwqAzr3YDiq1V/udsU5D1qA==", + "integrity": "sha1-QSjiy/pMjEYQ6O0zAFbCScXOsuk=", "requires": { "cheerio": "0.22.0", "mkdirp": "0.5.1", @@ -5550,7 +5550,7 @@ "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + "integrity": "sha1-VYqlO0O2YeGSWgr9+japoQhf5Xo=" }, "lodash.pick": { "version": "4.4.0", @@ -5711,7 +5711,7 @@ "moment": { "version": "2.24.0", "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", - "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" + "integrity": "sha1-DQVdU/UFKqZTyfbraLtdEr9cK1s=" }, "nan": { "version": "2.14.0", @@ -6675,7 +6675,7 @@ "nth-check": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "integrity": "sha1-sr0pXDfj3VijvwcAN2Zjuk2c8Fw=", "requires": { "boolbase": "~1.0.0" } @@ -7082,7 +7082,7 @@ "tiny-emitter": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", - "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", + "integrity": "sha1-HRpW7fxRxD6GPLtTgqcjMONVVCM=", "optional": true }, "tiny-lr": { diff --git a/preface/code-organization/index.html b/preface/code-organization/index.html new file mode 100644 index 0000000..8569227 --- /dev/null +++ b/preface/code-organization/index.html @@ -0,0 +1,532 @@ + + + + + + + Python 源代码的组织 · Python 3 源码分析 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  +
                  + + + + + + + + +
                  + +
                  + +
                  + + + + + + + + +
                  +
                  + +
                  +
                  + +
                  + +

                  Python 源代码的组织

                  +

                  源代码下载

                  +

                  方式 1:GitHub

                  +

                  Python 源代码可以在 GitHub 上方便的获取,执行:

                  +
                  git clone https://github.com/python/cpython.git
                  +git checkout v3.7.0
                  +
                  +

                  即可获取 Python 3.7.0 版本的代码。

                  +

                  方式 2:Python 官方网站

                  +

                  访问 https://www.python.org/downloads/release/python-370/ ,下拉至页面最下方,可选择下载 tarball 源码包。 +亦可执行:

                  +
                  wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz
                  +
                  +

                  即可获取 Python 3.7.0 版本的代码。

                  +

                  目录结构

                  +

                  进入源码目录,我们可以看到该目录下主要 包含以下文件(夹):

                  +
                  .
                  +├── Doc
                  +├── Grammar
                  +├── Include
                  +├── LICENSE
                  +├── Lib
                  +├── Mac
                  +├── Makefile.pre.in
                  +├── Misc
                  +├── Modules
                  +├── Objects
                  +├── PC
                  +├── PCbuild
                  +├── Parser
                  +├── Programs
                  +├── Python
                  +├── README.rst
                  +├── Tools
                  +├── aclocal.m4
                  +├── config.guess
                  +├── config.sub
                  +├── configure
                  +├── configure.ac
                  +├── install-sh
                  +├── m4
                  +├── pyconfig.h.in
                  +└── setup.py
                  +
                  +

                  其中:

                  +

                  Include 目录:包含了 Python 提供的所有头文件,如果用户需要自己用 C 或 C++来编写自定义模块扩展 Python,那么就需要用到这里提供的头文件。

                  +

                  Lib 目录:包含了 Python 自带的所有标准库,且都是用 Python 语言编写的。

                  +

                  Modules 目录:包含了所有用 C 语言编写的模块,比如 math、hashlib 等。它们都是那些对速度要求非常严格的模块。而相比而言,Lib 目录下则是存放一些对速度没有太严格要求的模块,比如 os。

                  +

                  Parser 目录:包含了 Python 解释器中的 Scanner 和 Parser 部分,即对 Python 源代码进行词法分析和语法分析的部分。除此以外,此目录还包含了一些有用的工具,这些工具能够根据 Python 语言的语法自动生成 Python 语言的词法和语法分析器,与 YACC 非常类似。

                  +

                  Objects 目录:包含了所有 Python 的内建对象,包括整数、list、dict 等。同时,该目录还包括了 Python 在运行时需要的所有的内部使用对象的实现。

                  +

                  Python 目录:包含了 Python 解释器中的 Compiler 和执行引擎部分,是 Python 运行的核心所在。

                  +

                  PCbuild 目录:包含了 Visual Studio 2003 的工程文件,研究 Python 源代码就从这里开始(本书将采用 Visual Studio 2017 对 Python 进行编译)。

                  +

                  Programs 目录:包含了 Python 二进制可执行文件的源码。

                  +
                  Copyright © FlagGo 2019 all right reserved,powered by Gitbook该文件修订时间: +2020-03-23 19:36:27 +
                  + +
                  + +
                  +
                  +
                  + +

                  results matching ""

                  +
                    + +
                    +
                    + +

                    No results matching ""

                    + +
                    +
                    +
                    + +
                    +
                    + +
                    + + + + + + + + + + + + + + +
                    + + +
                    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/preface/code-organization/index.md b/preface/code-organization/index.md deleted file mode 100644 index 986b921..0000000 --- a/preface/code-organization/index.md +++ /dev/null @@ -1,77 +0,0 @@ -# Python 源代码的组织 - -## 源代码下载 - -### 方式 1:GitHub - -Python 源代码可以在 GitHub 上方便的获取,执行: - -```console -git clone https://github.com/python/cpython.git -git checkout v3.7.0 -``` - -即可获取 `Python 3.7.0` 版本的代码。 - -### 方式 2:Python 官方网站 - -访问 https://www.python.org/downloads/release/python-370/ ,下拉至页面最下方,可选择下载 tarball 源码包。 -亦可执行: - -```console -wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz -``` - -即可获取 `Python 3.7.0` 版本的代码。 - -## 目录结构 - -进入源码目录,我们可以看到该目录下主要 包含以下文件(夹): - -```console -. -├── Doc -├── Grammar -├── Include -├── LICENSE -├── Lib -├── Mac -├── Makefile.pre.in -├── Misc -├── Modules -├── Objects -├── PC -├── PCbuild -├── Parser -├── Programs -├── Python -├── README.rst -├── Tools -├── aclocal.m4 -├── config.guess -├── config.sub -├── configure -├── configure.ac -├── install-sh -├── m4 -├── pyconfig.h.in -└── setup.py -``` - -其中: - -**Include 目录**:包含了 Python 提供的所有头文件,如果用户需要自己用 C 或 C++来编写自定义模块扩展 Python,那么就需要用到这里提供的头文件。 - -**Lib 目录**:包含了 Python 自带的所有标准库,且都是用 Python 语言编写的。 - -**Modules 目录**:包含了所有用 C 语言编写的模块,比如 math、hashlib 等。它们都是那些对速度要求非常严格的模块。而相比而言,Lib 目录下则是存放一些对速度没有太严格要求的模块,比如 os。 - -**Parser 目录**:包含了 Python 解释器中的 Scanner 和 Parser 部分,即对 Python 源代码进行词法分析和语法分析的部分。除此以外,此目录还包含了一些有用的工具,这些工具能够根据 Python 语言的语法自动生成 Python 语言的词法和语法分析器,与 YACC 非常类似。 - -**Objects 目录**:包含了所有 Python 的内建对象,包括整数、list、dict 等。同时,该目录还包括了 Python 在运行时需要的所有的内部使用对象的实现。 - -**Python 目录**:包含了 Python 解释器中的 Compiler 和执行引擎部分,是 Python 运行的核心所在。 - -**PCbuild 目录**:包含了 Visual Studio 2003 的工程文件,研究 Python 源代码就从这里开始(本书将采用 Visual Studio 2017 对 Python 进行编译)。 - -**Programs 目录**:包含了 Python 二进制可执行文件的源码。 diff --git a/preface/modify-code/index.html b/preface/modify-code/index.html new file mode 100644 index 0000000..995405b --- /dev/null +++ b/preface/modify-code/index.html @@ -0,0 +1,515 @@ + + + + + + + 修改 Python 源码 · Python 3 源码分析 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    +
                    + + + + + + + + +
                    + +
                    + +
                    + + + + + + + + +
                    +
                    + +
                    +
                    + +
                    + +

                    修改 Python 源码

                    +

                    在源代码中 Print

                    +

                    在接下来研究源码的过程中,我们可能会对某些语句的逻辑感到好奇,需要输出中间结果。 +这就需要借助 Python C API 中打印对象的接口:

                    +

                    源文件:Objects/object.c

                    +
                    int
                    +PyObject_Print(PyObject *op, FILE *fp, int flags)
                    +
                    +

                    比如,我们希望在解释器交互界面中打印整数值的时候输出一段字符串,则我们可以修改如下函数:

                    +

                    源文件:Objects/longobject.c

                    +
                    static PyObject *
                    +long_to_decimal_string(PyObject *aa)
                    +{
                    +    PyObject *str = PyUnicode_FromString("I am always before int");
                    +    PyObject_Print(str, stdout, 0);
                    +    printf("\n");
                    +
                    +    PyObject *v;
                    +    if (long_to_decimal_string_internal(aa, &v, NULL, NULL, NULL) == -1)
                    +        return NULL;
                    +    return v;
                    +}
                    +
                    +

                    函数实现中的前 3 行为我们加入的代码,其中:

                    +
                      +
                    • PyUnicode_FromString 用于把 C 中的原生字符数组转换为出 Python 中的字符串(Unicode)对象
                    • +
                    • PyObject_Print 则将转换好的字符串对象打印至我们指定的标准输出(stdout
                    • +
                    +

                    对 Python 重新进行编译,在 Unix 上可执行:

                    +
                    make && make bininstall
                    +
                    +

                    运行编译后的 Python,输入 print 语句即可看到我们希望的结果:

                    +
                    >>> print(1)
                    +'I am always before int'
                    +1
                    +
                    +
                    Copyright © FlagGo 2019 all right reserved,powered by Gitbook该文件修订时间: +2020-03-23 19:36:27 +
                    + +
                    + +
                    +
                    +
                    + +

                    results matching ""

                    +
                      + +
                      +
                      + +

                      No results matching ""

                      + +
                      +
                      +
                      + +
                      +
                      + +
                      + + + + + + + + + + + + + + +
                      + + +
                      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/preface/modify-code/index.md b/preface/modify-code/index.md deleted file mode 100644 index 8a38335..0000000 --- a/preface/modify-code/index.md +++ /dev/null @@ -1,51 +0,0 @@ -# 修改 Python 源码 - -## 在源代码中 Print - -在接下来研究源码的过程中,我们可能会对某些语句的逻辑感到好奇,需要输出中间结果。 -这就需要借助 Python C API 中打印对象的接口: - -`源文件:`[Objects/object.c](https://github.com/python/cpython/blob/v3.7.0/Objects/object.c#L339) - -```c -int -PyObject_Print(PyObject *op, FILE *fp, int flags) -``` - -比如,我们希望在解释器交互界面中打印整数值的时候输出一段字符串,则我们可以修改如下函数: - -`源文件:`[Objects/longobject.c](https://github.com/python/cpython/blob/v3.7.0/Objects/longobject.c#L1762) - -```c -static PyObject * -long_to_decimal_string(PyObject *aa) -{ - PyObject *str = PyUnicode_FromString("I am always before int"); - PyObject_Print(str, stdout, 0); - printf("\n"); - - PyObject *v; - if (long_to_decimal_string_internal(aa, &v, NULL, NULL, NULL) == -1) - return NULL; - return v; -} -``` - -函数实现中的前 3 行为我们加入的代码,其中: - -- `PyUnicode_FromString` 用于把 C 中的原生字符数组转换为出 Python 中的字符串(Unicode)对象 -- `PyObject_Print` 则将转换好的字符串对象打印至我们指定的标准输出(`stdout`) - -对 Python 重新进行编译,在 Unix 上可执行: - -```console -make && make bininstall -``` - -运行编译后的 Python,输入 print 语句即可看到我们希望的结果: - -```python ->>> print(1) -'I am always before int' -1 -``` diff --git a/preface/unix-linux-build/index.html b/preface/unix-linux-build/index.html new file mode 100644 index 0000000..cf52faa --- /dev/null +++ b/preface/unix-linux-build/index.html @@ -0,0 +1,547 @@ + + + + + + + UNIX/Linux 环境下编译 Python · Python 3 源码分析 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      +
                      + + + + + + + + +
                      + +
                      + +
                      + + + + + + + + +
                      +
                      + +
                      +
                      + +
                      + +

                      UNIX/Linux 环境下编译 Python

                      +

                      在 UNIX/Linux 环境下编译 Python 较为简单,主要分为两个步骤:

                      +
                        +
                      1. 环境准备(准备 Python 所依赖的必要环境)
                      2. +
                      3. 编译、安装
                      4. +
                      +

                      环境准备

                      +

                      常规操作系统中

                      +

                      编译 Python 前通常需要在系统上安装以下库:

                      +
                        +
                      • gcc // 编译工具
                      • +
                      • zlib // 压缩、解压相关库
                      • +
                      • libffi // Python 所以来的用于支持 C 扩展的库
                      • +
                      • openssl // 安全套接字层密码库,Linux 中通常已具备
                      • +
                      +

                      不同的发行版,安装方式和包名称也不尽相同。

                      +

                      对于 Debian/Ubuntu,执行:

                      +
                      sudo apt install -y zlib1g zlib1g-dev libffi-dev openssl libssl-dev
                      +
                      +

                      对于 RedHat/CentOS/Fedora,执行:

                      +
                      yum install -y zlib zlib-devel libffi-devel openssl openssl-devel
                      +
                      +

                      对于 macOS,执行:

                      +
                      xcode-select --install
                      +
                      +

                      运行于 Docker 的操作系统中

                      +

                      Docker 版的 Linux 发行版可能会有较多的库未安装,除了安装上一小节提及的库外,其他缺失库可根据情况自行安装:

                      +
                        +
                      • bzip2 // 压缩库
                      • +
                      • readline // GNU Readline 是一个软件库,它为使用命令行界面(如 Bash)的交互式程序提供了行编辑和历史功能
                      • +
                      • sqlite // 由 C 编写的小型数据库
                      • +
                      • libuuid // 跨平台的开源的 uuid 操作库
                      • +
                      • gdbm // 小型的数据库系统
                      • +
                      • xz // 压缩解压工具
                      • +
                      • tk-devel // 图形用户界面开发工具
                      • +
                      +

                      对于 Debian/Ubuntu,执行:

                      +
                      sudo apt-get install bzip2 libbz2-dev sqlite3 libsqlite3-dev libreadline6 libreadline6-dev libgdbm-dev uuid-dev tk-dev
                      +
                      +

                      对于 RedHat/CentOS/Fedora,执行:

                      +
                      yum install bzip2 bzip2-devel readline-devel sqlite-devel libuuid-devel gdbm-devel xz-devel tk-devel
                      +
                      +

                      编译、安装

                      +

                      进入 Python 源码根目录,执行以下命令:

                      +
                      ./configure
                      +make
                      +make install
                      +
                      +

                      Python 将会被编译,并安装在默认目录中。若您希望将 Python 安装在特定目录,则需要在一开始修改 configure 命令为:

                      +
                      ./configure --prefix=<Python要安装到的目录(绝对路径)>
                      +
                      +

                      在指定目录中:

                      +
                        +
                      • bin 目录 存放的是可执行文件
                      • +
                      • include 目录 存放的是 Python 源码的头文件
                      • +
                      • lib 目录 存放的是 Python 标准库
                          +
                        • lib/python3.7/config-3.7m-{platform} 目录 存放的是 libpython3.7m.a,该静态库用于使用 C 语言进行扩展。{platform} 代表平台,比如在 Mac OS 上为 “darwin”,在 Linux 上为 “x86_64-linux-gnu”
                        • +
                        +
                      • +
                      • share 目录 存放的是帮助等文件
                      • +
                      +

                      默认情况下,编译的 Python 是静态链接(libpython3.7m.a)。如果希望编译的 Python 是动态链接(libpython3.7m.so),则需要在一开始修改configure 命令为:

                      +
                      ./configure --enable-shared
                      +
                      +

                      如需重新编译,请首先执行:

                      +
                      make clean
                      +
                      +

                      再执行本节开头处的命令即可。

                      +
                      Copyright © FlagGo 2019 all right reserved,powered by Gitbook该文件修订时间: +2020-03-23 19:36:27 +
                      + +
                      + +
                      +
                      +
                      + +

                      results matching ""

                      +
                        + +
                        +
                        + +

                        No results matching ""

                        + +
                        +
                        +
                        + +
                        +
                        + +
                        + + + + + + + + + + + + + + +
                        + + +
                        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/preface/unix-linux-build/index.md b/preface/unix-linux-build/index.md deleted file mode 100644 index 0abd8cb..0000000 --- a/preface/unix-linux-build/index.md +++ /dev/null @@ -1,99 +0,0 @@ -# UNIX/Linux 环境下编译 Python - -在 UNIX/Linux 环境下编译 Python 较为简单,主要分为两个步骤: - -1. 环境准备(准备 Python 所依赖的必要环境) -2. 编译、安装 - -## 环境准备 - -### 常规操作系统中 - -编译 Python 前通常需要在系统上安装以下库: - -- `gcc` // 编译工具 -- `zlib` // 压缩、解压相关库 -- `libffi` // Python 所以来的用于支持 C 扩展的库 -- `openssl` // 安全套接字层密码库,Linux 中通常已具备 - -不同的发行版,安装方式和包名称也不尽相同。 - -对于 `Debian/Ubuntu`,执行: - -```console -sudo apt install -y zlib1g zlib1g-dev libffi-dev openssl libssl-dev -``` - -对于 `RedHat/CentOS/Fedora`,执行: - -```console -yum install -y zlib zlib-devel libffi-devel openssl openssl-devel -``` - -对于 `macOS`,执行: - -```console -xcode-select --install -``` - -### 运行于 Docker 的操作系统中 - -Docker 版的 Linux 发行版可能会有较多的库未安装,除了安装上一小节提及的库外,其他缺失库可根据情况自行安装: - -- `bzip2` // 压缩库 -- `readline` // GNU Readline 是一个软件库,它为使用命令行界面(如 Bash)的交互式程序提供了行编辑和历史功能 -- `sqlite` // 由 C 编写的小型数据库 -- `libuuid` // 跨平台的开源的 uuid 操作库 -- `gdbm` // 小型的数据库系统 -- `xz` // 压缩解压工具 -- `tk-devel` // 图形用户界面开发工具 - -对于 `Debian/Ubuntu`,执行: - -```console -sudo apt-get install bzip2 libbz2-dev sqlite3 libsqlite3-dev libreadline6 libreadline6-dev libgdbm-dev uuid-dev tk-dev -``` - -对于 `RedHat/CentOS/Fedora`,执行: - -```console -yum install bzip2 bzip2-devel readline-devel sqlite-devel libuuid-devel gdbm-devel xz-devel tk-devel -``` - -## 编译、安装 - -进入 Python 源码根目录,执行以下命令: - -```console -./configure -make -make install -``` - -Python 将会被编译,并安装在默认目录中。若您希望将 Python 安装在特定目录,则需要在一开始修改 `configure` 命令为: - -```console -./configure --prefix= -``` - -在指定目录中: - -- **bin 目录** 存放的是可执行文件 -- **include 目录** 存放的是 Python 源码的头文件 -- **lib 目录** 存放的是 Python 标准库 - - **lib/python3.7/config-3.7m-{platform} 目录** 存放的是 libpython3.7m.a,该静态库用于使用 C 语言进行扩展。`{platform}` 代表平台,比如在 Mac OS 上为 “darwin”,在 Linux 上为 “x86_64-linux-gnu” -- **share 目录** 存放的是帮助等文件 - -默认情况下,编译的 Python 是静态链接(libpython3.7m.a)。如果希望编译的 Python 是动态链接(libpython3.7m.so),则需要在一开始修改`configure` 命令为: - -```console -./configure --enable-shared -``` - -如需重新编译,请首先执行: - -```console -make clean -``` - -再执行本节开头处的命令即可。 diff --git a/preface/windows-build/index.html b/preface/windows-build/index.html new file mode 100644 index 0000000..546fd9d --- /dev/null +++ b/preface/windows-build/index.html @@ -0,0 +1,505 @@ + + + + + + + Windows 环境下编译 Python · Python 3 源码分析 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        +
                        + + + + + + + + +
                        + +
                        + +
                        + + + + + + + + +
                        +
                        + +
                        +
                        + +
                        + +

                        Windows 环境下编译 Python

                        +

                        在 Windows 环境下编译 Python 可完全通过界面操作,主要分为两个步骤:

                        +
                          +
                        1. 环境准备
                        2. +
                        3. 编译
                        4. +
                        +

                        环境准备

                        +

                        在 Python 3.6 及之后的版本可以使用微软的 +Visual Studio 2017 进行编译,选择社区版就足够了。

                        +

                        在下载完成后,需要注意安装环节的选项。由于 Python 3.7 所使用的 Windows SDK 的版本为 10.0.17134.0, +所以需要选择安装该 SDK,如下图所示: +

                        +

                        编译

                        +

                        进入 Python 源码根目录,打开 PCbuild\pcbiuld.sln 解决方案,而后进行一些设置:

                        +

                        在左侧的解决方案目录的顶端,右键选择“属性”,以打开属性界面(如下图所示)。

                        +

                        +

                        由于我们只是研究 Python 的核心部分,可以选择不编译标准库和外部依赖,在“配置属性”->“配置”中仅勾选 +python 和 pythoncore,然后点击“确定”(如下图所示)。

                        +

                        此外,默认情况下的编译设置是 Debug、32 位,您也可以根据自己的需求调整成 Release 或 64 位。

                        +

                        +

                        在左侧的解决方案目录中选择 python,右键选择“生成”,以进行编译:

                        +

                        +

                        编译结束后,生成的文件存放在PCbuild\win32目录下(如下图所示),打开python_d即可打开新生成的 Python 3.7 解释器。

                        +

                        +

                        更多内容

                        +

                        更多关于在 Windows 上进行编译和开发 Python 的内容见官方指南

                        +
                        Copyright © FlagGo 2019 all right reserved,powered by Gitbook该文件修订时间: +2020-03-23 19:36:27 +
                        + +
                        + +
                        +
                        +
                        + +

                        results matching ""

                        +
                          + +
                          +
                          + +

                          No results matching ""

                          + +
                          +
                          +
                          + +
                          +
                          + +
                          + + + + + + + + + + + + + + +
                          + + +
                          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/preface/windows-build/index.md b/preface/windows-build/index.md deleted file mode 100644 index 29b7785..0000000 --- a/preface/windows-build/index.md +++ /dev/null @@ -1,42 +0,0 @@ -# Windows 环境下编译 Python - -在 Windows 环境下编译 Python 可完全通过界面操作,主要分为两个步骤: - -1. 环境准备 -2. 编译 - -## 环境准备 - -在 Python 3.6 及之后的版本可以使用微软的 -[Visual Studio 2017](https://visualstudio.microsoft.com/zh-hans/vs/) 进行编译,选择社区版就足够了。 - -在下载完成后,需要注意安装环节的选项。由于 Python 3.7 所使用的 Windows SDK 的版本为 `10.0.17134.0`, -所以需要选择安装该 SDK,如下图所示: -![](vs2017-installation.png) - -## 编译 - -进入 Python 源码根目录,打开 `PCbuild\pcbiuld.sln` 解决方案,而后进行一些设置: - -在左侧的解决方案目录的顶端,右键选择“属性”,以打开属性界面(如下图所示)。 - - - -由于我们只是研究 Python 的核心部分,可以选择不编译标准库和外部依赖,在“配置属性”->“配置”中仅勾选 -python 和 pythoncore,然后点击“确定”(如下图所示)。 - -此外,默认情况下的编译设置是 Debug、32 位,您也可以根据自己的需求调整成 Release 或 64 位。 - - - -在左侧的解决方案目录中选择 python,右键选择“生成”,以进行编译: - - - -编译结束后,生成的文件存放在`PCbuild\win32`目录下(如下图所示),打开`python_d`即可打开新生成的 Python 3.7 解释器。 - - - - -## 更多内容 -更多关于在 Windows 上进行编译和开发 Python 的内容见[官方指南](https://devguide.python.org/setup/#windows-compiling) diff --git a/search_index.json b/search_index.json new file mode 100644 index 0000000..2ca2f3f --- /dev/null +++ b/search_index.json @@ -0,0 +1 @@ +{"index":{"version":"0.5.12","fields":[{"name":"title","boost":10},{"name":"keywords","boost":15},{"name":"body","boost":1}],"ref":"url","documentStore":{"store":{"./":["03","19:36:27","2019","2020","23","3","3.7","[","[x]","]","copyright","dict","flaggo","gitbook该文件修订时间:","http://localhost:4000","init","instal","list","make","node","npm","python","reserved,pow","right","roadmap","run","serv","set","unix/linux","window","©","介绍","使用","修改","内存管理机制","内建对象","前置条件","前言","即可查看本书内容。","命令去构建","命令的方式构建:","命令,或想直接使用","命令,执行如下命令进行初始化:","命令,简单执行如下命令进行初始化:","在线版,或者根据以下步骤访问本地版。","多线程机制","大体按照《python","字符串","安装项目依赖:","实现简版","对象","对象初探","希望各位","序章","您可以直接访问","您的系统上需要安装好","或者使用","执行如下命令运行服务端:","整数对象","本项目致力于对","模块加载机制","源代码的组织","源码","源码剖析》中的目录结构进行编写。依次介绍","源码剖析》,编写","源码基本信息、内建对象和虚拟机。","爱好者能参与其中,一起探索","环境下编译","的源码分析,深度参考陈儒大大的《python","的版本。","直接访问","章节","编译结果","若您不能使用","若您可使用","虚拟机","虚拟机一般表达式","虚拟机函数机制","虚拟机控制流","虚拟机框架","访问","运行环境初始化","魔法背后的奥秘!","(会自带npm)。"],"preface/code-organization/":[".","03","19:36:27","1:github","2003","2017","2019","2020","23","2:python","3.7.0","3.7.0.tar.xz","370/","aclocal.m4","c","c++来编写自定义模块扩展","checkout","clone","compil","config.guess","config.sub","configur","configure.ac","copyright","doc","flaggo","git","gitbook该文件修订时间:","github","grammar","https://github.com/python/cpython.git","https://www.python.org/downloads/release/python","https://www.python.org/ftp/python/3.7.0/python","includ","instal","lib","licens","m4","mac","makefile.pre.in","math、hashlib","misc","modul","object","os。","parser","pc","pcbuild","program","pyconfig.h.in","python","python,那么就需要用到这里提供的头文件。","readme.rst","reserved,pow","right","scanner","setup.pi","sh","studio","tarbal","tool","v3.7.0","visual","wget","yacc","©","└──","├──","上方便的获取,执行:","二进制可执行文件的源码。","亦可执行:","其中:","包含以下文件(夹):","即可获取","和","和执行引擎部分,是","在运行时需要的所有的内部使用对象的实现。","官方网站","对","或","提供的所有头文件,如果用户需要自己用","方式","源代码下载","源代码可以在","源代码就从这里开始(本书将采用","源代码的组织","源代码进行词法分析和语法分析的部分。除此以外,此目录还包含了一些有用的工具,这些工具能够根据","源码包。","版本的代码。","的内建对象,包括整数、list、dict","的工程文件,研究","目录下则是存放一些对速度没有太严格要求的模块,比如","目录结构","目录:包含了","目录:包含了所有","目录:包含了所有用","等。同时,该目录还包括了","等。它们都是那些对速度要求非常严格的模块。而相比而言,lib","自带的所有标准库,且都是用","解释器中的","访问","语言的词法和语法分析器,与","语言的语法自动生成","语言编写的。","语言编写的模块,比如","运行的核心所在。","进入源码目录,我们可以看到该目录下主要","进行编译)。","部分,即对","非常类似。",",下拉至页面最下方,可选择下载"],"preface/windows-build/":["03","10.0.17134.0,","19:36:27","2017","2019","2020","23","3.6","3.7","64",">“配置”中仅勾选","copyright","debug、32","flaggo","gitbook该文件修订时间:","pcbuild\\pcbiuld.sln","python","pythoncore,然后点击“确定”(如下图所示)。","python,右键选择“生成”,以进行编译:","releas","reserved,pow","right","sdk","sdk,如下图所示:","studio","visual","window","©","上进行编译和开发","位。","位,您也可以根据自己的需求调整成","及之后的版本可以使用微软的","可完全通过界面操作,主要分为两个步骤:","和","在","在下载完成后,需要注意安装环节的选项。由于","在左侧的解决方案目录中选择","在左侧的解决方案目录的顶端,右键选择“属性”,以打开属性界面(如下图所示)。","或","所以需要选择安装该","所使用的","更多关于在","更多内容","此外,默认情况下的编译设置是","源码根目录,打开","环境下编译","环境准备","由于我们只是研究","的内容见官方指南","的核心部分,可以选择不编译标准库和外部依赖,在“配置属性”","的版本为","编译","编译结束后,生成的文件存放在pcbuild\\win32目录下(如下图所示),打开python_d即可打开新生成的","解决方案,而后进行一些设置:","解释器。","进入","进行编译,选择社区版就足够了。"],"preface/unix-linux-build/":["./configur","//","03","19:36:27","2019","2020","23","3.7m","apt","bash)的交互式程序提供了行编辑和历史功能","bin","bzip2","c","clean","configur","copyright","debian/ubuntu,执行:","dev","devel","docker","enabl","flaggo","gcc","gdbm","gitbook该文件修订时间:","gnu","gnu”","includ","instal","lib","lib/python3.7/config","libbz2","libffi","libgdbm","libpython3.7m.a,该静态库用于使用","libreadline6","libsqlite3","libssl","libuuid","linux","mac","macos,执行:","make","openssl","os","prefix=","python","readlin","redhat/centos/fedora,执行:","reserved,pow","right","select","share","sqlite","sqlite3","sudo","tk","unix/linux","uuid","xcode","xz","y","yum","zlib","zlib1g","{platform}","©","“darwin”,在","“x86_64","上为","不同的发行版,安装方式和包名称也不尽相同。","中通常已具备","代表平台,比如在","再执行本节开头处的命令即可。","前通常需要在系统上安装以下库:","压缩、解压相关库","压缩库","压缩解压工具","发行版可能会有较多的库未安装,除了安装上一小节提及的库外,其他缺失库可根据情况自行安装:","命令为:","图形用户界面开发工具","在","在指定目录中:","如需重新编译,请首先执行:","存放的是","存放的是可执行文件","存放的是帮助等文件","安全套接字层密码库,linux","安装在特定目录,则需要在一开始修改","对于","将会被编译,并安装在默认目录中。若您希望将","小型的数据库系统","常规操作系统中","所以来的用于支持","所依赖的必要环境)","扩展的库","操作库","是一个软件库,它为使用命令行界面(如","是动态链接(libpython3.7m.so),则需要在一开始修改configur","是静态链接(libpython3.7m.a)。如果希望编译的","标准库","源码根目录,执行以下命令:","源码的头文件","版的","环境下编译","环境准备","环境准备(准备","由","的操作系统中","目录","编写的小型数据库","编译","编译、安装","编译工具","语言进行扩展。{platform}","跨平台的开源的","较为简单,主要分为两个步骤:","运行于","进入","默认情况下,编译的"],"preface/modify-code/":["&&","&v,","'i","(long_to_decimal_string_internal(aa,","*","*aa)","*fp,","*op,","*str","*v;","0);","03","1","1)","19:36:27","2019","2020","23","3","=","==",">>>","alway","api","befor","bininstal","c","copyright","file","flaggo","flags)","gitbook该文件修订时间:","int","int\");","int'","long_to_decimal_string(pyobject","make","null)","null,","null;","print","print(1)","printf(\"\\n\");","pyobject","pyobject_print","pyobject_print(pyobject","pyobject_print(str,","python","python,输入","pyunicode_fromstr","pyunicode_fromstring(\"i","reserved,pow","return","right","static","stdout,","unix","v;","{","}","©","上可执行:","中打印对象的接口:","中的原生字符数组转换为出","中的字符串(unicode)对象","修改","函数实现中的前","则将转换好的字符串对象打印至我们指定的标准输出(stdout)","在接下来研究源码的过程中,我们可能会对某些语句的逻辑感到好奇,需要输出中间结果。","在源代码中","对","比如,我们希望在解释器交互界面中打印整数值的时候输出一段字符串,则我们可以修改如下函数:","源文件:objects/longobject.c","源文件:objects/object.c","源码","用于把","行为我们加入的代码,其中:","语句即可看到我们希望的结果:","运行编译后的","这就需要借助","重新进行编译,在"],"objects/object/":["!=","\".\"","\"int\",","\"str\",","\"type\",","#defin","#els","#endif","#ifdef","&long_as_number,","&pylong_type);","(","((pyobject","(*binaryfunc)(pyobject","(0)","(_py_dec_reftot","(_py_decref_tmp)","(abstract","(binaryfunc)long_add,","(binaryfunc)long_mul,","(binaryfunc)long_sub,","(concret","(hashfunc)","(hashfunc)long_hash,","(here","(pyobject","(python","*","*)(op))","*)(op);","*);","*,","*/","*_ob_next;","*_ob_prev;","*_py_decref_tmp","*longobj","*ob_type;","*ob_type,它指向的类型对象就决定了一个对象是什么类型的。","*tp_as_async;","*tp_as_map","*tp_as_mapping;","*tp_as_mapping的分析与pynumbermethod","*tp_as_numb","*tp_as_number;","*tp_as_sequ","*tp_as_sequence;","*tp_name;","...","......","/*","/*nb_add*/","/*nb_multiply*/","/*nb_subtract*/","//","0","0)","0,","03","1)","1,","19:36:27","2)","2019","2020","23","3)","=",">ob_refcnt",">ob_refcnt++)",">ob_typ",">tp_hash(object);","\\","_object","_py_check_refcnt(_py_decref_tmp)","_py_count_allocs_comma","_py_dealloc(_py_decref_tmp);","_py_inc_reftot","_py_inc_tpallocs(op)","_py_newreference(op)","_py_ref_debug_comma","_pyobject_extra_init","_pyobject_head_extra","_typeobject","_typeobject代码","alloc","aol","api","api。例如整数对象,我们可以利用如下的","binari","binaryfunc","c++中的","calc_hash","calc_hash(pyobject*","char","class","col","compatibility)","const","copyright","destructor","flaggo","format","formerli","free","fundament","getattrfunc","getattrofunc","gitbook该文件修订时间:","hash","hash;","hashfunc","implement","include/object.h","intern","item","known","layer)","long_as_numb","long_dealloc,","long_to_decimal_string,","longobj","map","method","more","nb_inplace_matrix_multiply;","nb_matrix_multiply;","number","numer","ob_base;","ob_digit),","ob_refcnt","ob_refcnt;","ob_size;","ob_typ","object","object)","objects/longobject.c","objects/typeobject.c","objects/unicodeobject.c","offsetof(pylongobject,","oper","part","printfunc","printing,","py_decref(op)","py_decref将调用该对象的tp_dealloc来释放对象所占用的内存和系统资源;","py_hash_t","py_incref(op)","py_incref(op)与py_decref(op)","py_refcnt(op)","py_ssize_t","py_trace_ref","pyasyncmethod","pylong_fromlong(10);","pylong_typ","pylong_type中tp_as_number.nb_add","pylongobject","pylongobject*,那么它会调用","pymappingmethod","pynumbermethod","pynumbermethods;","pyobject","pyobject*","pyobject;","pyobject_head_init(type)","pyobject_new(pyobject,","pyobject_var_head","pysequencemethod","python","pytype_typ","pytype_type创建的","pytypeobject","pytypeobject;","pytypeobjet","pyunicode_typ","pyunicodeobject","pyunicodeobject*,那么就会调用","pyvarobject","pyvarobject;","pyvarobject_head_init(&pytype_type,","pyvarobject也是基于pyobject扩展的。","pyvarobject,而","reprfunc","reserved,pow","return","right","sequenc","setattrfunc","setattrofunc","sizeof(digit),","sizeof(pyheaptypeobject),","sizeof(pymemberdef),","standard","static","struct","suit","ternaryfunc","tp_as_map","tp_as_numb","tp_as_sequ","tp_basics","tp_basicsize,","tp_call;","tp_compar","tp_dealloc","tp_dealloc;","tp_getattr","tp_getattr;","tp_getattro;","tp_hash","tp_hash*/","tp_hash;","tp_items","tp_itemsize;","tp_name","tp_name,","tp_print","tp_print;","tp_repr","tp_repr;","tp_reserv","tp_setattr","tp_setattr;","tp_setattro;","tp_str;","type","typedef","unicode_hash,","unicode_hash函数","variabl","{","}","},","};","©","一个用于垃圾回收的双向链表,一个引用计数变量","一个类型对象指针ob_typ","一些对象属性","一堆方法定义,函数和指针","下图是对象运行时的图像表现","与类型相关的","与该类型对象相关的操作信息(如","中大量采用了内存对象池的技术,使得对象释放的空间归还给内存池而不是直接free,后续使用可先从对象池中获取","中定义了大量的函数指针。这些函数指针可以视为类型对象中","中提供了几个有用的宏:","中的","中的所有对象都拥有一些相同的内容,而这些内容就定义在pyobject中,","中的每个东西都是一个对象,","中,主要通过","中,每一个对象都将自己的引用计数、类型信息保存在开始的部分中。","为了方便对这部分内存初始化,python","主要用于","之后,","从代码中可以看出pyvarobject比pyobject多出了一个用于存储元素个数的变量ob_size。","以pylong_type为例,可以清晰的看到一般的类型对象和pytype_type之间的关系","以下是","但这并不意味着最终一定会调用","内部会用","内部各个函数之间传递的都是一种范型指针","内部调试用","决定的,那么类型对象的类型是由谁决定的呢?","函数","函数的指针是一个","创建","创建一个对象比如","创建对象有两种方式","创建该类型对象分配的内存空间大小","创建该类型对象时分配的空间大小信息,即","初始化代码中看到绑定的是long_hash函数","到底长什么样。","前面我们提到了pyobject","前面提到,在","动态进行判断,而","包含","包括创建对象需要分配多少内存,对象都支持哪些操作等等。","双向链表","变量来维护这个对象,其他对象也与此类似","变量,这个变量维护对象的引用计数,从而最终决定该对象的创建与销毁","变长对象都拥有一个相同的内容","和","在","在pytypeobject的代码中,我们还可以看到非常重要的三组操作族","在以下代码中可以看出pylong_type中的tp_as_number项指向的是long_as_numb","在开始我们的学习之旅之前,我们要先认识一个结构体pyobject,可以说","在类型机制中至关重要,所有用户自定义","垃圾回收","域","如pyobject_new。创建一个整数对象的方式","如果传递给","如果指针是一个","字典对象操作","定义了一个数值对象该支持的操作。一个数值对象如","定义开始有一个宏pyoject_var_head,查看源码可知","定长对象与变长对象","实现了多态机制","实际绑定的是","容纳其他对象的序列集合对象","对于其他对象,可以通过与其关联的类型对象确定其类型,那么通过什么来确定一个对象是类型对象呢?","对于初学者来说这么多类型的对象怎么学?别着急,我们后续章节会解答。","对应的","对象:","对象上,","对象初探","对象对应的类型对象中定义的","对象机制的基石","对象的分类","对象的创建","对象的多态性","对象的大致的一个分类","对象的类型是由该对象指向的","对象的行为","对象类型指针struct","对象都是通过","对象除了前面提到的那种分类方法外,还可以分为定长对象和变长对象这两种形式。","就指定了它进行加法操作时的具体行为。","序列对象操作","建立联系的。","引用计数","我们不知道这个指针所指的对象是什么类型,只能通过所指对象的","或称为","所","所以在","所定义的操作,这些操作直接决定着一个对象在运行时所表现出的行为,比如","指向类型对象的指针,决定了对象的类型","指明了该类型对象如何生成其hash值。","接下来我们看","接下来我们看一下struct","操作tp_hash,tp_hash可以在pytypeobject中找到,","操作,查看源码可以看到","数值对象","数值对象操作","整数对象,那么它的类型对象","时,会分配内存进行初始化,然后","是一个变长对象","是怎么与","更多标准操作","来增加和减少对一个对象的引用计数。当一个对象的引用计数减少到","标准类方法集","正是通过","源文件:include/object.h","源文件:objects/longobject.c","源文件:objects/longobject.h","源文件:objects/typeobject.c","源文件:objects/unicodeobject.c","的","的世界一切皆对象,不论是整数,还是字符串,甚至连类型、函数等都是一种对象。","的代码如下","的关联对象","的定义中包含许多信息,主要分类以下几类:","的对象机制就是基于pyobject拓展开来的,所以我们先看看pyobject","的执行效率。因此","相同,大家可以自行查阅源码","答案就是","类似","类型名","类型名,","类型对象","类型的类型","考虑以下的","而具体赋值绑定我们可以在","范型","虚拟机在运行时内部使用的对象","这两个宏","这些宏在各种内建类型对象的初始化中被大量使用。","这是一个非常重要的结构体,它不仅仅决定了一个对象的类型,还包含大量的元信息,","这样的函数指针)","这类","通常只能作用于某一种类型的对象上,对于每一种内建对象","通常形如pyobject_xxx这样的形式。可以应用在任何","通过引用计数来管理维护对象在内存中的存在与否","都提供了这样一组","都有ob_refcnt","释放内存空间。因为频繁的申请、释放内存会大大降低","需要用到"],"objects/long-object/":["!=","\"base\",","\"int\",","\"int()","#","#defin","#endif","#if","#ifdef","#ifndef","%d\\n\",","&","&&","&=","&_parser,","&int_info_desc)","&long_as_number,","&obase))","&pylong_type)","&pylong_type);","&x,","(","(!_pyarg_parsetupleandkeywordsfast(args,","((base","(;","(_pylong_on","(_pylong_zero","(base","(binaryfunc)long_add,","(binaryfunc)long_mul,","(binaryfunc)long_rshift,","(binaryfunc)long_sub,","(digit)abs(ival));","(digit)abs(ival);","(hashfunc)long_hash,","(i","(inclusive)","(inquiry)long_bool,","(int","(int_infotype.tp_nam","(ival","(not","(obas","(py_abs(py_size(a))","(pylongobject","(pystructsequence_inittype2(&int_infotype,","(sign","(size_a","(type","(unaryfunc)long_abs,","(unaryfunc)long_invert,","(unaryfunc)long_long,","(unaryfunc)long_neg,","(void)pyobject_init(v,","(x","(x_add","(z","*","*)aa;","**bytes_str)","**p_output,","*/","*a,","*a;","*aa,","*args,","*b)","*bytes_writer,","*kwargs)","*obas","*obase)","*obase);","*pin,","*pout,","*return_valu","*scratch,","*str","*temp","*type,","*v","*v;","*writer,","*x","*x,","*z;","+","...","/","/*","/*[clinic","/*nb_add","/*nb_and","/*nb_divmod","/*nb_float*/","/*nb_int*/","/*nb_invert","/*nb_lshift","/*nb_multipli","/*nb_neg","/*nb_or","/*nb_power","/*nb_remaind","/*nb_reserved*/","/*nb_rshift","/*nb_subtract","/*nb_xor","/*tp_absolut","/*tp_bool","/*tp_posit","//","0","0)","0);","0,","03","0;","0};","1","1)","10","15","19:36:27","1;","1]不为零,这与普通四则运算的加法运算相同,只不过进位单元不同而已","2","2**(shift*i)","2019","2020","23","257","257)","3","30","30,否则","36)","5","5,","6","8","9223372043297226753",";","=","==",">",">=",">>",">>=",">>>",">ob_digit[0]",">ob_digit[i]",">ob_digit[i])",">ob_digit[i];","@classmethod","[","[clinic","\\","_keywords,","_keywords[]","_longobject","_parser","_pyarg_pars","_pybyteswrit","_pylong_init(void)","_pylong_new(size_a);","_pylong_on","_pylong_zero","_pyunicodewrit","a;","abs(ob_size)","abs_ival;","absolut","add","argument\");","array","assert(","assert(borrow","a、b","b","b);","b;","base","base;","bit","borrow","borrow;","carri","carry;","char","check_binop(a,","check_small_int","check_small_int(ival)","check_small_int(ival);","code:","code]*/","const","copyright","count_alloc","cpython2","cpython3","d;","digit","doesn't","end","ensur","enum","equal","exit:","exit;","fast","file","flaggo","function","gener","get_small_int(sdigit","gitbook该文件修订时间:","goto","i+1;","i,","i;","i=0","inclusive).","index","initi","input=81c98f418af9eb6f]*/","input]","int","int.__new__","int_info","integ","integers.","ival","ival)","ival,","j;","k_mul","karatsuba","keep","kind;","kwargs,","larger","long","long_add","long_add(pylongobject","long_and,","long_as_numb","long_dealloc,","long_div,","long_divmod,","long_doc,","long_float,","long_getset,","long_long,","long_lshift,","long_methods,","long_mod,","long_mul(pylongobject","long_new","long_new(pytypeobject","long_new,","long_new_impl","long_new_impl(pytypeobject","long_new_impl(type,","long_norm","long_normalize(z);","long_or,","long_pow,","long_richcompare,","long_subtype_new(type,","long_to_decimal_string,","long_to_decimal_string_internal(pyobject","long_to_decimal_string_internal中添加如下代码并重新编译安装","long_true_divide,","long_xor,","longintrepr.h","longobject.h","miss","multipl","nb_floor_divid","nb_index","nb_inplace_add","nb_inplace_and","nb_inplace_floor_divid","nb_inplace_lshift","nb_inplace_multipli","nb_inplace_or","nb_inplace_pow","nb_inplace_remaind","nb_inplace_rshift","nb_inplace_subtract","nb_inplace_true_divid","nb_inplace_xor","nb_true_divid","ndigit","neg","negative;","nsmallnegint","nsmallnegints;","nsmallposint","nsmallposints];","null","null)","null);","null;","null};","num","number","ob_digit","ob_digit),","ob_digit[0]","ob_digit[1]","ob_digit[2]","ob_digit[abs(ob_size)","ob_digit[i]","ob_digit[i])","ob_digit[i];","ob_digit[index]);","ob_siz","ob_size,确保","obas","obase);","obase:","object(c_default=\"null\")","object/longobject.c","objects/clinic/longobject.c.h","objects/longobject.c","offsetof(pylongobject,","on","organ","out","output","output=e47cfe777ab0f24c","path","prealloc","preserv","print(num)","printf(\"ob_s","propag","py_abs(py_size(a)),","py_abs(py_size(b));","py_size(a));","py_size(v)","py_ssize_t","py_tpflags_basetyp","py_tpflags_default","py_tpflags_long_subclass,","pybytearray/pybyt","pyerr_occurred())","pyerr_setstring(pyexc_typeerror,","pyerr_setstring(pyexc_valueerror,","pyintobject","pylong_fromlong","pylong_fromlong(0);","pylong_fromlong(0l);","pylong_fromlong(1);","pylong_fromlong(long","pylong_fromlong,就不一一列举了","pylong_fromstr","pylong_fromunicodeobject,最终调用","pylong_mask;","pylong_shift","pylong_shift.","pylong_shift;","pylong_typ","pylongobject","pylongobject;","pynumber_asssize_t(obase,","pynumber_long","pynumber_long(x);","pynumbermethod","pyobject","pyobject_del,","pyobject_genericgetattr,","python","pytypeobject","pyunicod","pyunicode_kind","pyvarobject_head_init(&pytype_type,","quick_int_allocs++;","quick_int_allocs,","quick_neg_int_allocs++;","quick_neg_int_allocs;","rang","rem,","repres","representation.","reserved,pow","return","return_valu","return_value;","reveal","right","shared.","sign","sign;","singl","size,","size;","size_a","size_a,","size_b","sizeof(digit),","small","small_ints;","small_ints[nsmallnegint","start","static","string","strlen,","struct","subtract","sum(for","t;","temp;","tenpow;","terribl","those","through","tp_alloc","tp_as_buff","tp_as_map","tp_as_numb","tp_as_sequ","tp_base","tp_basics","tp_call","tp_clear","tp_dealloc","tp_descr_get","tp_descr_set","tp_dict","tp_dictoffset","tp_doc","tp_flag","tp_free","tp_getattr","tp_getattro","tp_getset","tp_hash","tp_init","tp_items","tp_iter","tp_iternext","tp_member","tp_method","tp_name","tp_new","tp_print","tp_repr","tp_reserv","tp_richcompar","tp_setattr","tp_setattro","tp_str","tp_travers","tp_weaklistoffset","two","two:","typedef","unsign","v","v;","valu","wiki","wimp","x","x,","x:","x_add","x_add(pylongobject","x_sub","x_sub(pylongobject","x_sub)","xxx","y","z","{","{\"\",","{\"|oo:int\",","|","}","};","©","一个数的绝对值等价于下面的表达式","一些整数在一开始就会被初始化一直留存,当再次使用直接从小整数对象池中获取,不用频繁的申请内存。","与操作","与普通四则运算减法相同,数不够大则向高一位借位,","且","为","乘法","从","从源码可以看出","会检查传入的数是否在小整数范围内,如果是直接返回。","位数的一半。","位系统中,pylong_shift","做处理","做进位处理,然后处理","具体可以看","具体实现在","决定的,64","减法","减法运算函数","函数可以看出有如下几种情况","函数是一种快速乘法","函数调整","分成位数较少的数,每个数都是原来","创建整数对象","加法","加法运算函数","又细分为两个函数","反转","取余","只保留了","可以在创建或复制整数对象等函数中找到","可以看出,创建一个整数对象的入口函数为","可以看到整数对象的数值操作较多,由于篇幅限制无法一一分析,这里只分析整数的部分操作","可以看到整数的加法运算函数","可见这个变化不是一蹴而就的,有比较艰辛的过程,大家有兴趣可以去挖掘一下","和","在","基本的原理和做法是将位数很多的两个大数","大于","如下图所示","宏","对象的高位数字,最后使用","小整数初始化","小整数对象","异或","或操作","数组的低位开始依次按位相加,carri","整数对象","整数对象的数值操作","整数的存储结构","整数相乘","整数相加","是变长对象","是由","有","根据","求bool值","求幂","注:这里的","添加打印代码","源文件","源文件:include/longintrepr.h","源文件:include/longobject.h","源文件:objects/clinic/longobject.c.h","源文件:objects/longobject.c","的","的整数对象","的示例图如下,注:pylong_shift","的第三行有这么一句话","的算法主要是用于两个大数的乘法,极大提高了运算效率,相较于普通乘法降低了复杂度,并在其中运用了递归的思想。","的身影,以下只列出了","确保","算法的实现","类型对象","绝对值","编译安装后进入","解释器输入如下代码","调用","调用_pylong_frombytes,最终调用","这两种类型,","这样处理之后,简化为做三次乘法,并附带少量的加法操作和移位操作。","逻辑右移","逻辑左移","都不为","默认的小整数范围是"],"objects/list-object/":["!=","\"\"\"","\"cannot","\"list","#","#defin","#endif","#ifdef","#ifndef","&&","'allocated'","(!initialized)","(!pylist_check(op))","((pylistobject","(9","(alloc","(cmp","(i","(indexerr","(item","(list_ass_slice(self,","(list_resize(self,","(n","(newitem","(newsiz","(op","(pylist_check(op)","(pyobject","(size","(size_t)news","(size_t)py_ssize_t_max","(v",")","*","*)","*))","*));","*);","*)null)","*)op)","*)op,","**)","**)pymem_realloc(self","**items;","**ob_item;","**p;","*/","*free_list[pylist_maxfreelist];","*newitem)","*op,","*op;","*self,","*v)","*value)","+","...","/","/*","/*[clinic","//","0","0)","0);","0,","03","0;","1))","1,","16,","19:36:27","1;","2,","2019","2020","23","25,","2]","3","3)","3,","35,","3]","4,","46,","4]","58,","6","72,","8)","8,","80","88,","=","==",">",">=",">>",">alloc",">allocated;",">ob_item",">ob_item,",">ob_item;","[0,","[1,","[]","_pyobject_gc_track(op);","accommod","add","addit","alloc","allocated/2","alway","amort","app1","app1((pylistobject","app1(pylistobject","appends()","assert","assert(self","assign","behavior","bypass","call","code:","contain","copyright","current","elements.","empti","end","enough","etc.","fall","fit","flaggo","free","gener","gitbook该文件修订时间:","give","growth","growth.","half","i)","i+1,","i,","i;","index","indexerr","indexerr);","initi","input=2dc2ba5bb2fb1f82]*/","ins1","ins1((pylistobject","ins1(pylistobject","int","invariants:","is:","item","items;","items[i+1]","items[i];","items[where]","larg","largest","linear","list","list\");","list.","list[0]","list_remov","list_remove(pylistobject","list_remove函数会遍历列表,使用pyobject_richcomparebool与目标值进行比较,","list_remove函数,","list_res","list_resize(pylistobject","listobject.c","listobject.h","long","lower","lst","lst.append(1)","lst.remove(3)","lst[0]","lst[3]","make","malloc","mild,","more","n","n)","n+1)","n;","new_alloc","new_allocated,","new_allocated;","newitem);","newsiz","newsize)","newsize.","newsize;","note:","null","null)","null))","null);","null;","num_allocated_byt","num_allocated_bytes);","num_allocated_bytes;","number","numfre","ob_item","ob_item[0],","ob_item[i],","ob_item[i];","ob_size.","ob_size不会改变allocated。","object","objects/listobject.c","op","op;","out","output=f087e1951a5e30d1","over","overalloc","overflow","p","pattern","perform","pointer","poorli","possibl","presenc","previou","print(lst[3])","proce","proport","py_atexit(show_alloc);","py_decref(op);","py_eq);","py_incref(v);","py_return_none;","py_size(op)","py_size(op))","py_size(self)","py_size(self);","py_ssize_t","py_ssize_t_max","py_ssize_t_max)","py_xdecref(newitem);","py_xsetref(*p,","pyerr_badinternalcall();","pyerr_nomemory();","pyerr_setobject(pyexc_indexerror,","pyerr_setstring(pyexc_indexerror,","pyerr_setstring(pyexc_overflowerror,","pylist_append","pylist_append(pyobject","pylist_get_size(self);","pylist_getitem","pylist_getitem(pyobject","pylist_insert","pylist_insert(pyobject","pylist_maxfreelist","pylist_new","pylist_new(py_ssize_t","pylist_setitem","pylist_setitem(pyobject","pylistobject","pylistobject对象的一些操作","pylistobject缓冲池默认大小为80","pymem_calloc(size,","pyobject","pyobject_var_head","python","pyunicode_fromstring(","range\");","realloc()","realloc().","reserved,pow","return","reus","right","room","save","scheme","self","sequenc","show_alloc_count","shrink","size","size)","size,","size;","size_t","size_t.","sizeof(pyobject","space","static","struct","system","time","typedef","us","v;","valu","value,","vector","where,","where;","won't","{","||","}","©","为了避免频繁的申请内存空间,创建pylistobject的时候会先检查缓冲池是否有可用空间","从app1代码可以看出追加元素操作大致流程如下","从ins1代码可以看出插入元素操作大致流程如下","会调用","元素赋值","元素赋值的示例","其他情况则需要调用pymem_realloc函数分配新的空间存储列表元素。","其公式为","其存储结构如下图","函数","函数list_resize就是用于调节list存储空间大小的","列表allocated的增长模式是","创建pylistobject","创建对象","合法性检查","在python中的list可以存放任何类型的数据,查看pylistobject可以发现,list实际存放的是pyobject*","实际调用的就是","对象","对象赋值","将元素插入list尾部","将元素插入指定位置","将要插入的位置的元素都往后移一个位置","当","指针","插入元素","时,list_resize只会改变","根据索引返回对应的元素","源文件:include/listobject.c","源文件:include/listobject.h","源文件:objects/listobject.c","相同则调用list_ass_slice进行移除,当遍历完列表还未找到则报错","示例","移除元素","移除元素示例","获取元素","获取元素的示例","调整list大小","调整list存储空间","调用","调用list_resize,将list大小加一","这里","追加元素","随着list元素的减少,list的存储空间可能存在冗余,这个时候就需要缩小list的存储空间。","随着list元素的增加,list的存储空间可能会不够用,这个时候就需要扩大list的存储空间。"],"objects/dict-object/":["!=","!pyunicode_checkexact(key))","\"","\",","\"combined\":","\"copyright\",","\"credits\"","\"help\",","\"integer,","\"license\"","#22653)","%d","%ld","%ld\\n\",","&","&&","&dk_entries(mp","&ep0[ix];","&old_value);","&old_value1);","&pydict_type);","'%.200s'\",","'2'作为","(!pydict_check(op))","(!pyunicode_checkexact(key)","(!pyunicode_checkexact(key))","('1')","('2')","('e')","((ix","((pyasciiobject","(;;)","(_pydict_hassplittable(mp)","(_pydict_hassplittable(mp))","(and","(d)","(default,","(dk","(dk_indices).","(dk_indices):","(ep","(err","(hash","(i","(i*5","(insertion_resize(mp)","(int8_t*)(mp","(ix","(ix1","(j=0;","(key_valu","(m","(map","(minus","(mp","(newsiz","(none)","(numfree)","(o","(old_valu","(oparg","(opcode)","(pop)","(py_type(mp)","(pydictobject","(pyindex_check(key))","(pylongobject*","(pyobject","(see","(size","(size_t)hash","(size_t)hash;","(w",")",")ep01",")key1;","*","*)","*)mp);","*)mp,","*)mp;","*)op;","**can**","**ma_values;","**value_addr)","**values)","*/","*contain","*dk;","*ep","*ep0","*ep01","*ep;","*indic","*key","*key,","*keys,","*m;","*ma_keys;","*map","*me_key;","*me_value;","*mp,","*mp;","*new_keys;","*new_keys_object(py_ssize_t","*o,","*old_value;","*op,","*sub","*v","*v,","*valu","*value)","*value_addr","*w)","+","...","/*","//","0","0)","0);","0){","0,","03","0412。","0;","0xff,","1","1)","1);","1/2","10","1024;","1060","11","12","128","14","16","16:17:57)","18","19:36:27","1;","2","2).","2.","2/3","20","20000","20000,是根据代码找到相关的","2019","2019,","2020","22","23","24","26","28","3","3);","3.7.3","30","32","4","5","6","7","7.3.0]","8","9",":",":\");",":0",";","=","==",">",">=",">>=",">>>",">dk_indices);",">dk_indices[0],",">dk_lookup",">dk_lookup(mp,",">dk_nentri",">dk_nentries)))",">dk_nentries);",">dk_nentries++;",">dk_nentries]",">dk_nentries];",">dk_refcnt",">dk_size",">dk_size);",">dk_size;",">dk_usabl",">hash)",">ma_key",">ma_keys);",">ma_keys)[ix].me_valu",">ma_keys)[mp",">ma_keys,",">ma_us",">ma_used);",">ma_used++;",">ma_used;",">ma_valu",">ma_values)",">ma_values[ix]",">ma_values[mp",">ma_version_tag",">me_hash",">me_key",">me_key));",">me_key,",">me_valu",">me_value;",">mp_ass_subscript(o,",">mp_ass_subscript)",">ob_digit[0]);",">ob_typ",">sq_ass_item)",">tp_as_mapping;",">tp_as_sequ",">tp_as_sequence)","[gcc","__eq__,","_dictkeysobject","_py_hot_funct","_py_newreference((pyobject","_pydict_newpresized((py_ssize_t)oparg);","_pydict_newpresized(py_ssize_t","activ","active:当","actual","anymore.","array","assert","assert(_pydict_checkconsistency(mp));","assert(ep","assert(is_power_of_2(size));","assert(ix","assert(key","assert(key);","assert(mp","assert(old_valu","assert(pyunicode_checkexact(ep","assert(pyunicode_checkexact(key)","assert(s","assert(value);","assignment\",","be:","build_map","cach","call_method","can't","cater","chang","code","combin","common.h","comparison","const","consum","contain","container[sub]","convert","copyright","count","count;","creat","d","d.pop('1')","d['1']='2'","d['1']='e'","d[10]","d[1]","d[2]","d[3]","d[5]","d[7]","d[9]","del","di","dict","dict_ass_sub","dict_ass_sub(pydictobject","dict_lookup_func","dict_next_version();","dict_test.pi","dictionari","dictionaries)与联合字典(combin","dictkeysobject","dictobject.c","dictonaries)。详细的信息可查看有关","differ","dispatch();","dk","dk;","dk_debug_incref","dk_decref(keys);","dk_entries(mp","dk_entries,","dk_entries.","dk_get_index(mp","dk_lookup","dk_lookup;","dk_mask(mp","dk_nentries;","dk_refcnt;","dk_set_index(mp","dk_size","dk_size;","dk_usable;","dkix_dummy(","dkix_dummy);","dkix_empti","dkix_empty(","dkix_empty)","dkix_empty;","dkix_error","dkix_error)","dkix_error.","dk,最后进行申请到的内存讲内容清空。接着就会进行","doesn't","don't","dummi","dummy:先前保存了一个","d,从输出信息可知,index","e.g.,","each","enter","entri","entries.","ep","ep01++;","err","err;","error;","es","es,","estimate_size(minused);","exception.","exception;","fail:","fail;","faster","field","flaggo","float","found","free_list[","free_values(values);","function","further","gener","gitbook该文件修订时间:","give","give;","global","goto","guarante","handl","hash","hash);","hash,","hash1","hash1,","hash;","hashpos,","here.","hold","i);","i,","i;","if)","implement","includ","include/dictobject.h","index","index>=0","indic","information.","insert","insertdict","insertdict()","insertdict(mp,","insertdict(pydictobject","instanc","instead","int","int8_t","issu","item","ix","ix)","ix1","ix;","j;","jme_key;","key","key)","key)))","key);","key,","key,value,每一个","key1","key1,","key;","key_valu","key_value,","key_value;","keys,","keys;","keys_free_list[","keys。当出现一个事件将字典的属性值进行改变的时候,个别字典将慢慢的转化成组合表的形式。这就保证了在大部分的应用场景下很高的内存利用效率,并保证了在各个场景下的正确性。当","keys,valu","key。接下来就详细分析一下相关流程。","key。操作字典如下所示;","known","larg","layout","linux","load_const","load_method","load_nam","lookdict()","lookdict():","lookdict(mp,","lookdict);","lookdict;","lookdict_split():","lookdict_unicod","lookdict_unicode()","lookdict_unicode():","lookdict_unicode_nodummy():","lookdict_unicode_nodummy(pydictobject","lookdict_unicode_nodummy;","lookdict_unicode_nodummy;","lookup","m","ma_key","ma_keys,","ma_keys.","ma_used;","ma_valu","ma_version_tag;","maintain_tracking(mp,","make","mask","mask;","max_pres","max_presize;","me_hash;","me_key.","me_valu","meaning","medium","memoryerror.","memset(&dk","memset(dk_entries(dk),","minsiz","minus","minused)","modifi","more","mp","mp_ass_subscript","necessari","never","new_dict","new_dict(pydictkeysobject","new_keys_object","newsiz","newsize;","non","null","null)","null);","null,","null;","null_error();","number","numfree];","numfreekeys];","o","o);","object","objects/abstract.c","objects/dict","objects/dictobject.c","old_valu","old_value1;","on","oparg;","order","overrid","peek(2*i","peek(2*i);","pend","pending:索引>=0,键!=空,值=空(仅拆分),尚未插入到拆分表中。","pending。","perturb","perturb_shift;","point","pointer","pop","pop_top","power","present.","printf(\"%","printf(\"found","printf(\"indic","printf(\"siz","printf(\"valu","purpose,","push(map);","py_decref(container);","py_decref(key);","py_decref(map);","py_decref(pop());","py_decref(sub);","py_decref(v);","py_decref(value);","py_hash_t","py_incref(key);","py_incref(value);","py_ssize_t","py_unreachable();","py_xdecref(old_value);","pydict_delitem((pyobject","pydict_delitem,设置一个","pydict_minsize);","pydict_minsize;","pydict_setitem((pyobject","pydict_setitem(map,","pydict_setitem(pyobject","pydict_setitem;","pydictentri","pydictkeyentri","pydictkeyentry;","pydictkeysobject","pydictkeysobject;","pydictkeysobject,最后就生成一个","pydictobject","pydictobject;","pyerr_badinternalcall();","pyerr_nomemory();","pyerr_occurred())","pyexc_indexerror);","pylong_fromlong(20000);","pylongobject*","pymappingmethod","pynumber_asssize_t(key,","pyobject","pyobject*","pyobject_gc_new(pydictobject,","pyobject_hash(key);","pyobject_hash(key1);","pyobject_head","pyobject_malloc(sizeof(pydictkeysobject)","pyobject_setitem","pyobject_setitem(container,","pyobject_setitem(pyobject","pysequence_setitem(o,","python","python/ceval.c","rais","re","reason","refer","reserved,pow","resiz","resize.","return","return_valu","right","second();","see","share","similar","size","size)","size);","size;","size_count","size_count,","size_t","sizeof(pydictkeyentry)","size,检查是否超过设置的大小,检查是否有缓存的字典数据可用,如果没有则申请内存重新生成一个","special","speed","split","splitted:","stackadj(","state","static","store","store_nam","store_subscr","str;","strict","string","struct","sub,","subclass","support","sure","switch","tabl","table.","tables.","table。如果从","table,如果重置大小作为保存实例属性的结果,并且只有一个该","table,它们的键表都被缓存在类型属性中,并且允许所有该类型的实例都可以共享该","target(build_map)","target(store_subscr)","third();","time","top();","tp_as_map","type","type_error(\"'%.200s'","type_error(\"sequ","typedef","uint64_t","unicod","unicode_eq(ep","unique,","unus","unused:没有插入任何一个获取的","us","usabl","usable);","usable;","usable_fraction(max_presize))","usable_fraction(size);","v","v);","v,","valu","value);","value.","value;","value_addr);","values;","values是否需要加入垃圾回收","value。","value,它不会删除","value,并且在此之前也没有存储任何的","veri","version","version:","w);","without","{","{20000:2}","{}","||","}","©","不为空并且","不为空的时候出现。","不为空,保存了一个键值对,activ","不会改变为一个","与","中删除一个","中对应的该值,而只是将","中添加内容时;","中,在一个","中,此时查看该执行函数;","为8","主要就是通过传入的","之间,如果超过这个阈值则字典就会自动扩容,扩容的策略大家可详细查看源码。","从该函数的执行可知,初始化的函数是从_pydict_newpres","从输出内容可知,字典的大小随之改变了,这也说明了","会被里面切换到","使用个数加1","使用加1","使用的keys个数","使用缓冲池对象","便利ma_key","保存key","保存计算得出的hash值","值与","值,me_valu","值,因为字典也被","偏移","內建函数与{}生成的字典,模块和大部分其他字典都会创建为","其中","其中为什么初始化的时候输入","其中就调用了字典的","其中的","其中,me_hash","其中,pydictkeysobject","函数进行处理设置值;","则该类型对象不支持设置","初始化数据;","初始化的时候,就输出如上所示内容;我们接下来继续操作;","初始化的状态。","判断不能为空","判断缓冲池是否有","到","可以转变为","可用减1","可用的entry数量","可知,删除一个","可知,该命令就是讲'1'作为","和","哈希查找函数","在","在初始化的时候都会处于这种状态,并且","如果key相同","如果mp的ma_values有值","如果不为空则保存的是valu","如果为空则证明找到一个可以使用的","如果新建失败则报错","如果是分离的","如果有则是保存的keys数据","如果有设置该类型","如果错误就报错处理","字典","字典对象是通过","字典最大的容量","字典概述","字典的两种类型","字典的初始化流程","字典的插入与查找","字典的操作测试","字典的最佳大小容量限定在","字典示例","字典,一个","字典,该字典的行为方式与最初的字典的行为方式大致相同。","容器的相关数据结构","对应的方法,在初始化之后对应的是","对象","对象的变化过程中,entri","对象,最后返回。至此,dict","将申请的内存置空","将该值赋值","就是","就是哈希生成的值,me_key","就是对应的","就是对应的值。","就是根据","就是记录了","就表示该处未使用。","已经使用的entry数量","开始,该函数就是生成并初始化一个字典;","引用计数","弹出栈上输入参数的引用","当删除的时候,dummi","当我们继续向","当被创建的字典是用来保存","态,当有","或者","找到对应的值并讲该值设置到map中","插入到","插入,这就是","数值中移除了该","新建并初始化一个字典","方法删除一个","方法就是将生成的方法,插入到字典中去;","方法,此时就是调用","方法;","方法;此时我们分析一下,dict","时,me_key","是否有缓存,如果有缓存就选择缓存中的dk","本次示例脚本如下:","来创建一个新的字典,接着就对新建的字典","来实现数据的,详情如下;","查找一个可用的hash位置","根据经验在1/2和2/3之间效果最好","检查key是否是索引","检查mp","检查size是否大于最小s","检查传入的key是否hash为","检查传入的数量是否超过最大值","检查在新建的过程中是否通过参数传值","检查如果不是unicode则直接调用lookdict方法查找","检查是否为空如果任一为空则报错","检查是否可用","检查是否报错","检查是否是分离表,如果没查找到旧值并且","检查是否是字典类型","检查是否是2的倍数","检查是否需要执行下一条字节码指令","此后我们一直添加值进","此时,从栈中取出相关参数,并将这些值传入","没有缓存可使用的字典则申请内存生成一个","测试代码","源文件:include/dict","源文件:include/dictobject.h","源文件:objects/abstract.c","源文件:objects/dictobject.c","源文件:python/ceval.c","然后编译运行;","状态,当一个键被删除的时候,这只会在","现在我们动手观看一下具体的操作实例,首先声明,该例子仅供调试使用,目前调试的字典的","生成hash调用key对应的tp_hash方法","生成hash调用key对应的tp_hash方法,在本例中传入的是str类型,则调用str类型的tp_hash方法","的","的__dict__属性时,该字典才会创建为一个","的位置不能被重新使用,一旦发生碰撞,探针序列就无法知道这对键值对曾是活跃的键值对。","的创建工作已经完成。","的反汇编工具获取字节码;","的大小必须是2的倍数","的字典中,一个键值对的对应保存就是","的字典就是实现了一个","的字典类型中包含了两种,分离字典(split","的定义如下;","的实例,字典会立马再变为一个","的执行流程;","的描述pep","的方法集。此时就调用了","的方法集,并调用了该方法集的","的状态会在不同的状态间转换。基本上在如下四种状态中转换:unused、active、dummi","的索引值,","的虚拟机执行函数;","的键值对,但是这个键值对被删除了并且一个活跃的键值对还没有填入该位置,dummi","直接讲value设置到entry上面","直接设置ma_values对应的ix到values中","直接通过","相关数据结构的内存布局为;","相同的就将","第一个值为key","类型并且不能","类型来保存;","缓冲池没有则申请新的对象并初始化","自身实现的结构中引用了多次,所以我们就设置了一个特殊值来跟踪我们想要的字典;当","获取keys的首个元素地址","获取下一个位置","获取作为队列的操作集","获取大小","获取存取的地址","获取最小的值,在新建一个空的字典的时候该值为0","获取生成的最终的值","获取类型的tp_as_mapping方法集","获取该位置元素值","行;","表。","讲key对应的value设置为空","讲生成的map压栈","设置ma_used为0","设置为找到的值(这也是字典查找的核心逻辑)。至此,字典的插入的大致流程已经分析完毕。","设置到从缓冲池或者新生成一个","设置大小","设置字典的最小值","设置引用计数","设置是否可用","设置查找函数","设置该key对应的valu","设置该值","该为valu","该为字典对象","该函数的主要工作就是查找,字典中是否有空余的值,或者如果找到了满足","调用查找方法","调用索引插入","调用该mp_ass_subscript方法","调用该方法设置值","输出的字节码如下;","返回","返回。继续查看","进行了赋值操作与更新操作,最后调用了","通过","通过字节码指令可知,首先调用了","通过字节码的指令","通过查找","都是","重新改变大小,它会立马改变为一个","首先会调用相关的查找方法,去查找待搜索的值是否已经存在字典中,如果当前字典数据已经满了则会按照增长大小的函数生成一个新的字典,并把旧数据设置到新的字典中,当找到的字典匹配时则返回。","首先,先计算出需要生成的字典的大小,然后再初始化一个","首先,讲如下代码插入到",",通过描述可知,python","d","hash值也相同","key列表"],"objects/set-object/":["!=","&","&&","&so","&table[i];","(!pyfrozenset_check(anyset)","(!pyset_check(anyset)","(!pyunicode_checkexact(key)","((pyasciiobject","((size_t)so","(1)","(2)","(3)","(4)","(5)","(add)","(cmp","(entri","(err","(freeslot","(hash","(i","(is_oldtable_malloced)","(iter","(newsiz","(newtabl","(none)","(pyobject","(pysetobject","(pyunicode_checkexact(startkey)","(remove)","(rv","(set","(set_a)","(set_update_internal(so,","(size_t)hash","(size_t)so","(so","(startkey","(union)","(update)",")","*","*)","*)anyset,","*)so;","*)type","*/","*anyset,","*entry;","*freeslot;","*item","*iterable)","*key)","*key,","*key;","*necessary*","*newtable,","*old_key;","*oldtable,","*set","*so,","*so;","*startkey","*table,","*table;","*tmpkey;","*type,","*weakreflist;","+","...","/*","//","0","0)","0);","0,","03","0;","1","1)","1))","1,2,所以会在执行字节码指令的时候,执行","12","15","18","19:36:27","1;","2","2.","2019","2020","21","23","24","25","28","3","3/5","31","34","37","38","4","41","44","47","5","50","51","54","57","6","60","63","66","67","7","70","73","76","79","82","85","86","89","9",":",";","=","==",">",">=",">>=",">fill",">fill*5",">fill++;",">finger",">hash",">hash)",">hash);",">key",">key,",">key;",">mask",">mask;",">smalltable;",">tabl",">table;",">table[i];",">tp_alloc(type,",">use",">used)",">used);",">used*2",">used*4);",">used++;",">used;",">used>50000",">weakreflist","?","_pyunicode_eq(startkey,","activ","add","addit","anything.","anyway","arbitrari","aren't","assert(minus","assert(newt","assert(oldt","assert(startkey","avoid","befor","behavior","bigger","build_set","cach","call_funct","can't","cmp","cmp;","code","comparison","comparison_error:","contain","copi","copyright","cours","data","dealloc","defin","di","discard_found;","discard_notfound;","dispatch();","do","dummi","dummies,","dummy)","dummy);","dummy;","dummy,并且将","dummy;set_discard_key","empty,","entri","entries*/","entries.","entries;","entry;","err","error;","fail","field","fill","fill;","fill==size,","find","finger","finger;","fix","flaggo","found_active:","found_active;","found_null:","found_null;","found_unused:","found_unused;","found_unused_or_dummy:","found_unused_or_dummy;","freeslot","frequent","frozenset","gitbook该文件修订时间:","go","goto","hash","hash)","hash);","hash;","hash值为","hash,便于查找,set","hash,如果能够被","help","i;","increment","index","indexing,","insertion.","instead","int","intrins","is_oldtable_malloc","is_oldtable_malloced;","it,","item);","iterable))","iterable);","j;","key","key)","key))","key);","key,","key;","larg","len(set),和","linear_prob","list","load_attr","load_const","load_nam","m","make","make_new_set(&pyset_type,","make_new_set(pytypeobject","malloc'","mask","mask,","mask;","memcpy(small_copy,","memori","memset(newtable,","minused)","minused.","more","necessari","need","needed.","neutral","never","new","newmask","newmask,","newmask;","newsiz","newsize);","newtabl","newtable;","null","null)","null);","null;","number","object","old","old_key","oldmask","oldtabl","oldtable)","oldtable);","oldtable,","oldtable;","on","oparg);","oparg;","over,","over;","overflow","peek(i);","perturb","perturb)","perturb;","perturb_shift;","perturb设置为当前hash值","point","pointer","pop()","pop_top","power","pre","prevent","purg","push(set);","py_decref(item);","py_decref(key);","py_decref(old_key);","py_decref(set);","py_decref(so);","py_decref(startkey);","py_eq);","py_hash_t","py_incref(key);","py_incref(startkey);","py_refcnt(anyset)","py_ssize_t","pyerr_badinternalcall();","pyerr_nomemory();","pymem_del(oldtable);","pymem_new(setentry,","pyobject","pyobject_hash(key);","pyobject_head","pyobject_richcomparebool(startkey,","pyset_add(pyobject","pyset_add(set,","pyset_add,该函数的本质与","pyset_mins","pyset_minsize)","pyset_minsize;","pyset_minsize默认我8,mask为7","pyset_new","pyset_new(null);","pyset_new(pyobject","pysetobject","pysetobject;","python","python/ceval.c","pyunicode_checkexact(key)","rebuild","refcount","refer","regist","remov","repeat","reserved,pow","resiz","restart:","restart;","return","return_valu","rich","right","runtim","rv","rv;","s","s.add(1)","s.add(2)","s.add(7)","save","search","searches.","set","set,","set_a","set_a.add(3)","set_a.add(3)本质都调用了更底层","set_a.add(4)","set_a.remove(1)","set_a.union({1,5})","set_a.update({3,})","set_add_entri","set_add_entry(pysetobject","set_add_entry(so,","set_add_key","set_add_key((pysetobject","set_add_key(pysetobject","set_discard_entri","set_discard_entry(pysetobject","set_discard_entry(so,","set_discard_key","set_discard_key(pysetobject","set_discard_key(so,","set_insert_clean(newtable,","set_insert_clean(setentri","set_lookkey","set_lookkey(so,","set_lookkey该方法与插入的逻辑类似大家可自行查看","set_remove()函数上,如下示例;","set_remove(pysetobject","set_table_res","set_table_resize(pysetobject","set_test.pi","setentri","setentry;","set。作为一个无序的集合,set","set,扩充的原则就是如果当前的","shrinking,","size","size_t","sizeof(setentry)","sizeof(small_copy));","slot","slots,","small","small_copy;","small_copy[pyset_minsize];","smaller.","smallest","smalltabl","smalltable[pyset_minsize];","speed","spill","stackadj(","startkey","startkey)","static","store","store_nam","struct","subtle:","tabl","table.","table;","tables.","target(build_set)","termin","tests.","that'","typedef","union","unsign","up","updat","us","used;","used>50000","virgin","void","we'r","weak","x","xxx","{","{1,2}","||","}","©","一个","不支持","不记录元素位置或者插入点。因此,set","与","与hash求和的mask","中,如果相同则不插入,如果索引对应的值且值不同,则遍历从该索引往后9个位置的值,依次找到有空余位置的值,并将该值设置进去。如果设置该值之后使用的数量占总的申请数量超过了","中,对应的","中;","主要依靠","主要是检查是否","也是基于","从","会根据保存的元素自动调整大小。相关的内存布局如下;","但是fill数量未变","使用总数加1","使用数加1","使用数量减1","保存数据的数组","保存数据的数组数组指针","值减1,此处没有减去","值,如果计算出的索引值,没有值,则直接将该值存入对应的","先获取旧的tabl","内存申请失败则返回为空","减少该对象引用","函数将值加入到","函数来实现;","函数的执行流程;","函数的执行过程;","函数;","则什么也不做","则直接返回,如果能被","则继续调用","则设置freeslot","则调用","则重新扩充","初始化为空;","初始化的时候都为0","删除元素,调用","加上","加1与mask求余获取下一个索引值","包括已经使用的entry与空entry值的总和","包括所有曾经申请过的数量。","反汇编获取该脚本的字节码;","右移5位","向字典中添加key;","在","在本例的初始化过程中,由于传入了初始值","大致的","如果key相同则跳转到found_active处执行","如果set改变了则重新开始查找","如果不相同则重置fill为used的值","如果不能hash","如果不能hash则返回","如果两个表相同则删除旧tabl","如果为空则申请内存失败报错","如果为空则跳转值found_null设置key与hash","如果为空则跳转到found_nul","如果使用的与曾经使用的数量相同","如果使用的相同则什么都不做","如果值不为空则插入到新的table中","如果已使用的总数大于3/5则重新调整table,如果set使用的总数超过了50000则扩展为以前的2倍否则就是四倍","如果当前hash值相等","如果找到为空则直接跳转到found_unused_or_dummy处","如果找到了该值","如果找到则跳转到found_act","如果找到当前hash为空或者key为空的则跳转到found_unused_or_dummy处执行","如果找到的hash值相同","如果找到的值与传入需要设置的值相同则跳转到found_active处执行","如果是unicode,通过类型转换检查两个key的内容是否相同,如果不相同则跳转到found_active处","如果是其他类型的对象则调用比较方法去比较两个key是否相同","如果有迭代器","如果比较失败则返回","如果没有找到则获取下一个索引值","如果没有找到则返回-1","如果没有找到,则获取当前table的头部节点","如果相同","如果获取的新大小与pyset_minsize的大小相同","如果获取索引的值没有被使用则直接跳转到found_unused处执行","对象","将传入初始化的参数传入","将保存数据的头指针指向tabl","将内容更新到so中","将数据拷贝到set_lookkey中","将该key设置为dummi","就对应一个","就是保存的数据的","就是保存的数据,hash","就进行两倍扩充否则就进行四倍扩充。","已经使用可用的总量","并依次对set进行添加操作","或其它类序列的操作。","所对应的","执行下一条指令","找到entry而key为空则返回notfound","找到正常值则讲该值对应的entry设置为dummi","指令,初始化完成之后,就调用","提高key的引用计数","插入的概述如下,默认","支持","新建并初始化一个set","新申请内存","新申请的内存置空","方法如下;","方法来讲对应的","方法添加元素,调用","方法;","是否可用","是否能够被","是无序且不重复的集合,是可变的,通常用来从列表中删除重复项以及计算数学运算,如交集、并集、差分和对称差分等集合操作。set","最小的拷贝数组","来保存数据值的;","来合并集合。接下来就详细分析一下相关的操作流程。","来更新集合,通过","查找","查找该值","检查freeslot是否为空如果为空则跳转到found_unused处执行即找到了dummy位置","检查key是否为dummi","检查如果不为dummy并且key不为空的情况下","检查新申请的与就table不同","检查是否为dummi","检查是否为unicode,并比较如果不相同则跳转到found_act","检查是否可用hash如果可用则调用set_discard_entry方法","此时基本的流程就是通过传入的","此时就会调用","此时就是查找该值,如果找到该值并将该值设置为","此时继续查看","源文件:include/setobject.h","源文件:objects/setobject.c","源文件:python/ceval.c","申请该元素的内存","的","的值插入到新表中;","的值的存储是通过结构","的值,然后判断是否","的创建与初始化","的删除","的删除操作主要集中在","的执行流程可知,字典的初始化过程就是初始化相关数据结构。","的插入","的插入过程执行完毕。","的操作基本如上所述。","的数据结构如下;","的数量,从此处可知,fill","的检查,此时如果可用","的虚拟机执行函数如下;","相同并且需要重新","相同,如果相同则全部插入,如果不同,则遍历旧","示例脚本如下:","移动弹栈","类型数据,set","索引值*5","继续查看","获取so","获取下一个元素","获取传入值的hash值","获取当前entri","获取当前key","获取新table的地址","获取新的mask","获取索引对应的值","获取该值","表来实现。对应的","计算下一个索引值继续寻找","计算完成后添加值","计算索引","讲set压栈","讲不为空并且不为","设置hash值为","设置key与hash值","设置为","设置新的size","设置旧的mask","该函数主要就是做了检查","该函数主要就是检查传入的","调用key本身的方法比较","调用了","输出的字节码如下所示;","返回初始化完成的set","返回返现","返回0","通过","通过传入的hash与mask求索引下标","通过该字节码指令可知,创建","重新插入该列表该值","重置table指向新t","集合","集合(set)示例","集合概述","默认初始化为8个元素,通过table指向"],"objects/simple-interpreter/":["03","19:36:27","2019","2020","23","copyright","flaggo","gitbook该文件修订时间:","python","reserved,pow","right","©","字符串","实现简版","对象"]},"length":11},"tokenStore":{"root":{"0":{"3":{"docs":{"./":{"ref":"./","tf":0.006134969325153374},"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182},"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863},"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629},"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425},"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133},"objects/simple-interpreter/":{"ref":"objects/simple-interpreter/","tf":0.07142857142857142}}},"4":{"1":{"2":{"docs":{},"。":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"docs":{}},"docs":{}},"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/long-object/":{"ref":"objects/long-object/","tf":0.004230118443316413},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.004087193460490463},"objects/set-object/":{"ref":"objects/set-object/","tf":0.007180156657963447}},")":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.008658008658008658},"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565},"objects/list-object/":{"ref":"objects/list-object/","tf":0.00411522633744856},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0013623978201634877},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0026109660574412533}},";":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}},"{":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},",":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.011544011544011544},"objects/long-object/":{"ref":"objects/long-object/","tf":0.02961082910321489},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.005922165820642978},"objects/list-object/":{"ref":"objects/list-object/","tf":0.010973936899862825},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.002270663033605813},"objects/set-object/":{"ref":"objects/set-object/","tf":0.00587467362924282}}},"}":{"docs":{},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}},"x":{"docs":{},"f":{"docs":{},"f":{"docs":{},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"1":{"0":{"2":{"4":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"docs":{}},"6":{"0":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},"docs":{}},"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.002270663033605813}},".":{"0":{"docs":{},".":{"1":{"7":{"1":{"3":{"4":{"docs":{},".":{"0":{"docs":{},",":{"docs":{"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863}}}},"docs":{}}},"docs":{}},"docs":{}},"docs":{}},"docs":{}},"docs":{}}},"docs":{}}},"1":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}}},"2":{"8":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"4":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},"5":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"6":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.006357856494096276}},",":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}}},":":{"1":{"7":{"docs":{},":":{"5":{"7":{"docs":{},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"docs":{}},"docs":{}}},"docs":{}},"docs":{}}},"8":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"9":{"docs":{},":":{"3":{"6":{"docs":{},":":{"2":{"7":{"docs":{"./":{"ref":"./","tf":0.006134969325153374},"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182},"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863},"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629},"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425},"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133},"objects/simple-interpreter/":{"ref":"objects/simple-interpreter/","tf":0.07142857142857142}}},"docs":{}},"docs":{}}},"docs":{}},"docs":{}}},"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425},"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.029518619436875566},"objects/set-object/":{"ref":"objects/set-object/","tf":0.01370757180156658}},":":{"docs":{},"g":{"docs":{},"i":{"docs":{},"t":{"docs":{},"h":{"docs":{},"u":{"docs":{},"b":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}}}}},")":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425},"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0013623978201634877},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0039164490861618795}},")":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}}}},",":{"2":{"docs":{},",":{"docs":{},"所":{"docs":{},"以":{"docs":{},"会":{"docs":{},"在":{"docs":{},"执":{"docs":{},"行":{"docs":{},"字":{"docs":{},"节":{"docs":{},"码":{"docs":{},"指":{"docs":{},"令":{"docs":{},"的":{"docs":{},"时":{"docs":{},"候":{"docs":{},",":{"docs":{},"执":{"docs":{},"行":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}}},"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.00338409475465313},"objects/list-object/":{"ref":"objects/list-object/","tf":0.013717421124828532},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0036330608537693005},"objects/set-object/":{"ref":"objects/set-object/","tf":0.006527415143603133}}},"]":{"docs":{},"不":{"docs":{},"为":{"docs":{},"零":{"docs":{},",":{"docs":{},"这":{"docs":{},"与":{"docs":{},"普":{"docs":{},"通":{"docs":{},"四":{"docs":{},"则":{"docs":{},"运":{"docs":{},"算":{"docs":{},"的":{"docs":{},"加":{"docs":{},"法":{"docs":{},"运":{"docs":{},"算":{"docs":{},"相":{"docs":{},"同":{"docs":{},",":{"docs":{},"只":{"docs":{},"不":{"docs":{},"过":{"docs":{},"进":{"docs":{},"位":{"docs":{},"单":{"docs":{},"元":{"docs":{},"不":{"docs":{},"同":{"docs":{},"而":{"docs":{},"已":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"/":{"2":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},"docs":{}}},"2":{"0":{"0":{"0":{"0":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.007266121707538601}},",":{"docs":{},"是":{"docs":{},"根":{"docs":{},"据":{"docs":{},"代":{"docs":{},"码":{"docs":{},"找":{"docs":{},"到":{"docs":{},"相":{"docs":{},"关":{"docs":{},"的":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}},"docs":{}},"3":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}},"docs":{}},"1":{"7":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182},"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863}}},"9":{"docs":{"./":{"ref":"./","tf":0.006134969325153374},"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182},"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863},"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629},"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425},"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133},"objects/simple-interpreter/":{"ref":"objects/simple-interpreter/","tf":0.07142857142857142}},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"docs":{}},"2":{"0":{"docs":{"./":{"ref":"./","tf":0.006134969325153374},"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182},"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863},"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629},"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425},"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133},"objects/simple-interpreter/":{"ref":"objects/simple-interpreter/","tf":0.07142857142857142}}},"docs":{}},"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},"1":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"2":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}}},"3":{"docs":{"./":{"ref":"./","tf":0.006134969325153374},"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182},"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863},"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629},"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425},"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133},"objects/simple-interpreter/":{"ref":"objects/simple-interpreter/","tf":0.07142857142857142}}},"4":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"5":{"7":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},")":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}},"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},",":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}}}},"6":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},"8":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.010899182561307902},"objects/set-object/":{"ref":"objects/set-object/","tf":0.005221932114882507}},":":{"docs":{},"p":{"docs":{},"y":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"n":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}}}}},")":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}},".":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"*":{"docs":{},"*":{"docs":{},"(":{"docs":{},"s":{"docs":{},"h":{"docs":{},"i":{"docs":{},"f":{"docs":{},"t":{"docs":{},"*":{"docs":{},"i":{"docs":{},")":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}},",":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}}},"]":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}},".":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"/":{"3":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},"docs":{}}},"3":{"0":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},",":{"docs":{},"否":{"docs":{},"则":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}},"1":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"2":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},"4":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"5":{"docs":{},",":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}}}},"6":{"docs":{},")":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}},"7":{"0":{"docs":{},"/":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}},"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"8":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"docs":{"./":{"ref":"./","tf":0.006134969325153374},"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.008174386920980926},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0026109660574412533}},".":{"6":{"docs":{"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863}}},"7":{"docs":{"./":{"ref":"./","tf":0.006134969325153374},"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0273972602739726}},".":{"0":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.011363636363636364}},".":{"docs":{},"t":{"docs":{},"a":{"docs":{},"r":{"docs":{},".":{"docs":{},"x":{"docs":{},"z":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}}}}}},"3":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},"docs":{}},"m":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}},"docs":{}},")":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},",":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}},"]":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}},"/":{"5":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"docs":{}}},"4":{"1":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"4":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"6":{"docs":{},",":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}}}},"7":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.005449591280653951},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0019582245430809398}},",":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.00411522633744856}}},"]":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}},"5":{"0":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"1":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"4":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"7":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"8":{"docs":{},",":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}}}},"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.003178928247048138},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0026109660574412533}},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}},"6":{"0":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"3":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"4":{"docs":{"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863}}},"6":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"7":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.003178928247048138},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}},"7":{"0":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"2":{"docs":{},",":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}}}},"3":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"6":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"9":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0013623978201634877},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0019582245430809398}},".":{"3":{"docs":{},".":{"0":{"docs":{},"]":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"docs":{}}},"docs":{}}},"8":{"0":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}},"2":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"5":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"6":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"8":{"docs":{},",":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}}}},"9":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.009536784741144414}},")":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}},",":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}}}},"9":{"2":{"2":{"3":{"3":{"7":{"2":{"0":{"4":{"3":{"2":{"9":{"7":{"2":{"2":{"6":{"7":{"5":{"3":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}}},"docs":{}},"docs":{}},"docs":{}},"docs":{}},"docs":{}},"docs":{}},"docs":{}},"docs":{}},"docs":{}},"docs":{}},"docs":{}},"docs":{}},"docs":{}},"docs":{}},"docs":{}},"docs":{}},"docs":{}},"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}},"docs":{},"[":{"0":{"docs":{},",":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}}}},"1":{"docs":{},",":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}},"docs":{"./":{"ref":"./","tf":0.07975460122699386},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},"x":{"docs":{},"]":{"docs":{"./":{"ref":"./","tf":0.0736196319018405}}}},"c":{"docs":{},"l":{"docs":{},"i":{"docs":{},"n":{"docs":{},"i":{"docs":{},"c":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}}}}}}}},"]":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}},"g":{"docs":{},"c":{"docs":{},"c":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"]":{"docs":{"./":{"ref":"./","tf":0.07975460122699386}}},"c":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.011363636363636364},"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.013888888888888888},"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.02127659574468085}},"o":{"docs":{},"p":{"docs":{},"y":{"docs":{},"r":{"docs":{},"i":{"docs":{},"g":{"docs":{},"h":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.006134969325153374},"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182},"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863},"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629},"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425},"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133},"objects/simple-interpreter/":{"ref":"objects/simple-interpreter/","tf":0.07142857142857142}}}}}}}},"i":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}},"m":{"docs":{},"p":{"docs":{},"i":{"docs":{},"l":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"b":{"docs":{},"i":{"docs":{},"l":{"docs":{},"i":{"docs":{},"t":{"docs":{},"y":{"docs":{},")":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}},"r":{"docs":{},"i":{"docs":{},"s":{"docs":{},"o":{"docs":{},"n":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"_":{"docs":{},"e":{"docs":{},"r":{"docs":{},"r":{"docs":{},"o":{"docs":{},"r":{"docs":{},":":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}},"b":{"docs":{},"i":{"docs":{},"n":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.003178928247048138}}}}},"m":{"docs":{},"o":{"docs":{},"n":{"docs":{},".":{"docs":{},"h":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0018165304268846503}}}}}}}},"n":{"docs":{},"f":{"docs":{},"i":{"docs":{},"g":{"docs":{},".":{"docs":{},"g":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"s":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}}},"s":{"docs":{},"u":{"docs":{},"b":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}},"u":{"docs":{},"r":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182},"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}},"e":{"docs":{},".":{"docs":{},"a":{"docs":{},"c":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}}}}}}},"s":{"docs":{},"t":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},"u":{"docs":{},"m":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"e":{"docs":{},"r":{"docs":{},"[":{"docs":{},"s":{"docs":{},"u":{"docs":{},"b":{"docs":{},"]":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"l":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}},"d":{"docs":{},"e":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}},":":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}},"]":{"docs":{},"*":{"docs":{},"/":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}}}}}}},"u":{"docs":{},"n":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},"_":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}},"r":{"docs":{},"s":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}},"+":{"docs":{},"+":{"docs":{},"来":{"docs":{},"编":{"docs":{},"写":{"docs":{},"自":{"docs":{},"定":{"docs":{},"义":{"docs":{},"模":{"docs":{},"块":{"docs":{},"扩":{"docs":{},"展":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}}}}}}}},"中":{"docs":{},"的":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}},"h":{"docs":{},"e":{"docs":{},"c":{"docs":{},"k":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}},"_":{"docs":{},"b":{"docs":{},"i":{"docs":{},"n":{"docs":{},"o":{"docs":{},"p":{"docs":{},"(":{"docs":{},"a":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}}}}}}}}}},"s":{"docs":{},"m":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"_":{"docs":{},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}},"(":{"docs":{},"i":{"docs":{},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},")":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}}}}}}},"a":{"docs":{},"r":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}}},"n":{"docs":{},"g":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"l":{"docs":{},"o":{"docs":{},"n":{"docs":{},"e":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}},"e":{"docs":{},"a":{"docs":{},"n":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}},"a":{"docs":{},"s":{"docs":{},"s":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.002886002886002886}}}}}},"a":{"docs":{},"l":{"docs":{},"c":{"docs":{},"_":{"docs":{},"h":{"docs":{},"a":{"docs":{},"s":{"docs":{},"h":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.002886002886002886}},"(":{"docs":{},"p":{"docs":{},"y":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},"*":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}},"l":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}},"_":{"docs":{},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"d":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}},"f":{"docs":{},"u":{"docs":{},"n":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0032637075718015664}}}}}}}}}},"r":{"docs":{},"r":{"docs":{},"i":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.004230118443316413}}},"y":{"docs":{},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}},"c":{"docs":{},"h":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}},"n":{"docs":{},"'":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"p":{"docs":{},"y":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"n":{"2":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}},"3":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}},"docs":{}}}}}}},"u":{"docs":{},"r":{"docs":{},"r":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}},"r":{"docs":{},"e":{"docs":{},"a":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"m":{"docs":{},"p":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}},"d":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.003178928247048138}},"i":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"c":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.006134969325153374},"objects/dict-object/":{"ref":"objects/dict-object/","tf":3.3369663941871024}},"_":{"docs":{},"a":{"docs":{},"s":{"docs":{},"s":{"docs":{},"_":{"docs":{},"s":{"docs":{},"u":{"docs":{},"b":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},"(":{"docs":{},"p":{"docs":{},"y":{"docs":{},"d":{"docs":{},"i":{"docs":{},"c":{"docs":{},"t":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}}},"l":{"docs":{},"o":{"docs":{},"o":{"docs":{},"k":{"docs":{},"u":{"docs":{},"p":{"docs":{},"_":{"docs":{},"f":{"docs":{},"u":{"docs":{},"n":{"docs":{},"c":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}},"n":{"docs":{},"e":{"docs":{},"x":{"docs":{},"t":{"docs":{},"_":{"docs":{},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"(":{"docs":{},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0013623978201634877}}}}}}}}}}}}}}}}},"t":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},".":{"docs":{},"p":{"docs":{},"i":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"a":{"docs":{},"r":{"docs":{},"i":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0027247956403269754}},"e":{"docs":{},"s":{"docs":{},")":{"docs":{},"与":{"docs":{},"联":{"docs":{},"合":{"docs":{},"字":{"docs":{},"典":{"docs":{},"(":{"docs":{},"c":{"docs":{},"o":{"docs":{},"m":{"docs":{},"b":{"docs":{},"i":{"docs":{},"n":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}}}},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},"s":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},".":{"docs":{},"c":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}}}}}}}}},"n":{"docs":{},"a":{"docs":{},"r":{"docs":{},"i":{"docs":{},"e":{"docs":{},"s":{"docs":{},")":{"docs":{},"。":{"docs":{},"详":{"docs":{},"细":{"docs":{},"的":{"docs":{},"信":{"docs":{},"息":{"docs":{},"可":{"docs":{},"查":{"docs":{},"看":{"docs":{},"有":{"docs":{},"关":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}}}},"g":{"docs":{},"i":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.00338409475465313}}}}},"f":{"docs":{},"f":{"docs":{},"e":{"docs":{},"r":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"s":{"docs":{},"p":{"docs":{},"a":{"docs":{},"t":{"docs":{},"c":{"docs":{},"h":{"docs":{},"(":{"docs":{},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}},"c":{"docs":{},"a":{"docs":{},"r":{"docs":{},"d":{"docs":{},"_":{"docs":{},"f":{"docs":{},"o":{"docs":{},"u":{"docs":{},"n":{"docs":{},"d":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}},"n":{"docs":{},"o":{"docs":{},"t":{"docs":{},"f":{"docs":{},"o":{"docs":{},"u":{"docs":{},"n":{"docs":{},"d":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}},"o":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"c":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}},"k":{"docs":{},"e":{"docs":{},"r":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.009259259259259259}}}}}},"e":{"docs":{},"s":{"docs":{},"n":{"docs":{},"'":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"n":{"docs":{},"'":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"e":{"docs":{},"b":{"docs":{},"u":{"docs":{},"g":{"docs":{},"、":{"3":{"2":{"docs":{"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863}}},"docs":{}},"docs":{}}}},"i":{"docs":{},"a":{"docs":{},"n":{"docs":{},"/":{"docs":{},"u":{"docs":{},"b":{"docs":{},"u":{"docs":{},"n":{"docs":{},"t":{"docs":{},"u":{"docs":{},",":{"docs":{},"执":{"docs":{},"行":{"docs":{},":":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.009259259259259259}}}}}}}}}}}}}}}}},"v":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.041666666666666664}},"e":{"docs":{},"l":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.05092592592592592}}}}},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{},"u":{"docs":{},"c":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}},"l":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}},"f":{"docs":{},"i":{"docs":{},"n":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}},".":{"docs":{},"p":{"docs":{},"o":{"docs":{},"p":{"docs":{},"(":{"docs":{},"'":{"1":{"docs":{},"'":{"docs":{},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}},"docs":{}}}}}}},"[":{"1":{"0":{"docs":{},"]":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"docs":{},"]":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"2":{"docs":{},"]":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"3":{"docs":{},"]":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}}}},"5":{"docs":{},"]":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"7":{"docs":{},"]":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"9":{"docs":{},"]":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"docs":{},"'":{"1":{"docs":{},"'":{"docs":{},"]":{"docs":{},"=":{"docs":{},"'":{"2":{"docs":{},"'":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"docs":{},"e":{"docs":{},"'":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}},"docs":{}}},"k":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.003178928247048138}},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},"_":{"docs":{},"d":{"docs":{},"e":{"docs":{},"b":{"docs":{},"u":{"docs":{},"g":{"docs":{},"_":{"docs":{},"i":{"docs":{},"n":{"docs":{},"c":{"docs":{},"r":{"docs":{},"e":{"docs":{},"f":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}},"c":{"docs":{},"r":{"docs":{},"e":{"docs":{},"f":{"docs":{},"(":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},"s":{"docs":{},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"r":{"docs":{},"i":{"docs":{},"e":{"docs":{},"s":{"docs":{},"(":{"docs":{},"m":{"docs":{},"p":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0013623978201634877}}}}},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},".":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}}}}}}}}}},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},"_":{"docs":{},"i":{"docs":{},"n":{"docs":{},"d":{"docs":{},"e":{"docs":{},"x":{"docs":{},"(":{"docs":{},"m":{"docs":{},"p":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}},"l":{"docs":{},"o":{"docs":{},"o":{"docs":{},"k":{"docs":{},"u":{"docs":{},"p":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}},"m":{"docs":{},"a":{"docs":{},"s":{"docs":{},"k":{"docs":{},"(":{"docs":{},"m":{"docs":{},"p":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}},"n":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"r":{"docs":{},"i":{"docs":{},"e":{"docs":{},"s":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}},"r":{"docs":{},"e":{"docs":{},"f":{"docs":{},"c":{"docs":{},"n":{"docs":{},"t":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"_":{"docs":{},"i":{"docs":{},"n":{"docs":{},"d":{"docs":{},"e":{"docs":{},"x":{"docs":{},"(":{"docs":{},"m":{"docs":{},"p":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"u":{"docs":{},"s":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{},"e":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}},"i":{"docs":{},"x":{"docs":{},"_":{"docs":{},"d":{"docs":{},"u":{"docs":{},"m":{"docs":{},"m":{"docs":{},"y":{"docs":{},"(":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}},"e":{"docs":{},"m":{"docs":{},"p":{"docs":{},"t":{"docs":{},"i":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},"y":{"docs":{},"(":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"r":{"docs":{},"r":{"docs":{},"o":{"docs":{},"r":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},".":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}},",":{"docs":{},"最":{"docs":{},"后":{"docs":{},"进":{"docs":{},"行":{"docs":{},"申":{"docs":{},"请":{"docs":{},"到":{"docs":{},"的":{"docs":{},"内":{"docs":{},"存":{"docs":{},"讲":{"docs":{},"内":{"docs":{},"容":{"docs":{},"清":{"docs":{},"空":{"docs":{},"。":{"docs":{},"接":{"docs":{},"着":{"docs":{},"就":{"docs":{},"会":{"docs":{},"进":{"docs":{},"行":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}}}}}}},"u":{"docs":{},"m":{"docs":{},"m":{"docs":{},"i":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0039164490861618795}},"e":{"docs":{},"s":{"docs":{},",":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}},"y":{"docs":{},":":{"docs":{},"先":{"docs":{},"前":{"docs":{},"保":{"docs":{},"存":{"docs":{},"了":{"docs":{},"一":{"docs":{},"个":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}},")":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},",":{"docs":{},"并":{"docs":{},"且":{"docs":{},"将":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}},";":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"_":{"docs":{},"d":{"docs":{},"i":{"docs":{},"s":{"docs":{},"c":{"docs":{},"a":{"docs":{},"r":{"docs":{},"d":{"docs":{},"_":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}}}},",":{"docs":{},"从":{"docs":{},"输":{"docs":{},"出":{"docs":{},"信":{"docs":{},"息":{"docs":{},"可":{"docs":{},"知":{"docs":{},",":{"docs":{},"i":{"docs":{},"n":{"docs":{},"d":{"docs":{},"e":{"docs":{},"x":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}},"a":{"docs":{},"t":{"docs":{},"a":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}},"f":{"docs":{},"l":{"docs":{},"a":{"docs":{},"g":{"docs":{},"g":{"docs":{},"o":{"docs":{"./":{"ref":"./","tf":0.006134969325153374},"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182},"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863},"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629},"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425},"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133},"objects/simple-interpreter/":{"ref":"objects/simple-interpreter/","tf":0.07142857142857142}}}},"s":{"docs":{},")":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425}}}}}},"o":{"docs":{},"a":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"i":{"docs":{},"l":{"docs":{},"e":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}},"l":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0026109660574412533}},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"=":{"docs":{},"=":{"docs":{},"s":{"docs":{},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},",":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}},"t":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}},"e":{"docs":{},"l":{"docs":{},"d":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}},"n":{"docs":{},"d":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"g":{"docs":{},"e":{"docs":{},"r":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}},"x":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}},"o":{"docs":{},"r":{"docs":{},"m":{"docs":{},"a":{"docs":{},"t":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}},"e":{"docs":{},"r":{"docs":{},"l":{"docs":{},"i":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}},"u":{"docs":{},"n":{"docs":{},"d":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.016802906448683014}},"_":{"docs":{},"a":{"docs":{},"c":{"docs":{},"t":{"docs":{},"i":{"docs":{},"v":{"docs":{},"e":{"docs":{},":":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0039164490861618795}}}}}}}}},"n":{"docs":{},"u":{"docs":{},"l":{"docs":{},"l":{"docs":{},":":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}}}}},"u":{"docs":{},"n":{"docs":{},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"d":{"docs":{},":":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}},"_":{"docs":{},"o":{"docs":{},"r":{"docs":{},"_":{"docs":{},"d":{"docs":{},"u":{"docs":{},"m":{"docs":{},"m":{"docs":{},"y":{"docs":{},":":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}}}}}}}}}}}}}}}}}}}}},"r":{"docs":{},"e":{"docs":{},"e":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}},"_":{"docs":{},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"[":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"(":{"docs":{},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}},"s":{"docs":{},"l":{"docs":{},"o":{"docs":{},"t":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0032637075718015664}}}}}}},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}},"o":{"docs":{},"z":{"docs":{},"e":{"docs":{},"n":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}},"u":{"docs":{},"n":{"docs":{},"d":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}},"c":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0013623978201634877}}}}}}}},"r":{"docs":{},"t":{"docs":{},"h":{"docs":{},"e":{"docs":{},"r":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}},"a":{"docs":{},"s":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},"e":{"docs":{},"r":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"l":{"docs":{},"l":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}},"i":{"docs":{},"l":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},":":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"g":{"docs":{},"i":{"docs":{},"t":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.011363636363636364}},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"k":{"docs":{},"该":{"docs":{},"文":{"docs":{},"件":{"docs":{},"修":{"docs":{},"订":{"docs":{},"时":{"docs":{},"间":{"docs":{},":":{"docs":{"./":{"ref":"./","tf":0.006134969325153374},"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182},"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863},"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629},"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425},"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133},"objects/simple-interpreter/":{"ref":"objects/simple-interpreter/","tf":0.07142857142857142}}}}}}}}}}}}}},"h":{"docs":{},"u":{"docs":{},"b":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}},"v":{"docs":{},"e":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.002270663033605813}},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"r":{"docs":{},"a":{"docs":{},"m":{"docs":{},"m":{"docs":{},"a":{"docs":{},"r":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}}},"o":{"docs":{},"w":{"docs":{},"t":{"docs":{},"h":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}},".":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}},"c":{"docs":{},"c":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}},"d":{"docs":{},"b":{"docs":{},"m":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.009259259259259259}}}}},"n":{"docs":{},"u":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}},"”":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}},"e":{"docs":{},"t":{"docs":{},"a":{"docs":{},"t":{"docs":{},"t":{"docs":{},"r":{"docs":{},"f":{"docs":{},"u":{"docs":{},"n":{"docs":{},"c":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}},"o":{"docs":{},"f":{"docs":{},"u":{"docs":{},"n":{"docs":{},"c":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}},"_":{"docs":{},"s":{"docs":{},"m":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"_":{"docs":{},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},"(":{"docs":{},"s":{"docs":{},"d":{"docs":{},"i":{"docs":{},"g":{"docs":{},"i":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}}}}},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0025380710659898475},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"o":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"t":{"docs":{},"o":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0018165304268846503},"objects/set-object/":{"ref":"objects/set-object/","tf":0.010443864229765013}}}}},"l":{"docs":{},"o":{"docs":{},"b":{"docs":{},"a":{"docs":{},"l":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"u":{"docs":{},"a":{"docs":{},"r":{"docs":{},"a":{"docs":{},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}},"h":{"docs":{},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{},":":{"docs":{},"/":{"docs":{},"/":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{},"a":{"docs":{},"l":{"docs":{},"h":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},":":{"4":{"0":{"0":{"0":{"docs":{"./":{"ref":"./","tf":0.006134969325153374}}},"docs":{}},"docs":{}},"docs":{}},"docs":{}}}}}}}}}}}}}},"s":{"docs":{},":":{"docs":{},"/":{"docs":{},"/":{"docs":{},"g":{"docs":{},"i":{"docs":{},"t":{"docs":{},"h":{"docs":{},"u":{"docs":{},"b":{"docs":{},".":{"docs":{},"c":{"docs":{},"o":{"docs":{},"m":{"docs":{},"/":{"docs":{},"p":{"docs":{},"y":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"n":{"docs":{},"/":{"docs":{},"c":{"docs":{},"p":{"docs":{},"y":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"n":{"docs":{},".":{"docs":{},"g":{"docs":{},"i":{"docs":{},"t":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"w":{"docs":{},"w":{"docs":{},"w":{"docs":{},".":{"docs":{},"p":{"docs":{},"y":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"n":{"docs":{},".":{"docs":{},"o":{"docs":{},"r":{"docs":{},"g":{"docs":{},"/":{"docs":{},"d":{"docs":{},"o":{"docs":{},"w":{"docs":{},"n":{"docs":{},"l":{"docs":{},"o":{"docs":{},"a":{"docs":{},"d":{"docs":{},"s":{"docs":{},"/":{"docs":{},"r":{"docs":{},"e":{"docs":{},"l":{"docs":{},"e":{"docs":{},"a":{"docs":{},"s":{"docs":{},"e":{"docs":{},"/":{"docs":{},"p":{"docs":{},"y":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"n":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}}}}}}}}}}}}}}}}}}}}}},"f":{"docs":{},"t":{"docs":{},"p":{"docs":{},"/":{"docs":{},"p":{"docs":{},"y":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"n":{"docs":{},"/":{"3":{"docs":{},".":{"7":{"docs":{},".":{"0":{"docs":{},"/":{"docs":{},"p":{"docs":{},"y":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"n":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}}}}}},"docs":{}}},"docs":{}}},"docs":{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"a":{"docs":{},"s":{"docs":{},"h":{"1":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"docs":{"objects/object/":{"ref":"objects/object/","tf":0.004329004329004329},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.004541326067211626},"objects/set-object/":{"ref":"objects/set-object/","tf":0.007180156657963447}},";":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251},"objects/set-object/":{"ref":"objects/set-object/","tf":0.00587467362924282}}},"f":{"docs":{},"u":{"docs":{},"n":{"docs":{},"c":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}},")":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0032637075718015664}},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0019582245430809398}}}},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.002270663033605813}}},"p":{"docs":{},"o":{"docs":{},"s":{"docs":{},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"值":{"docs":{},"为":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}},",":{"docs":{},"便":{"docs":{},"于":{"docs":{},"查":{"docs":{},"找":{"docs":{},",":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}},"如":{"docs":{},"果":{"docs":{},"能":{"docs":{},"够":{"docs":{},"被":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}},"l":{"docs":{},"f":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}},"n":{"docs":{},"d":{"docs":{},"l":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}}}}}},"e":{"docs":{},"r":{"docs":{},"e":{"docs":{},".":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}},"l":{"docs":{},"p":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}},"o":{"docs":{},"l":{"docs":{},"d":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"i":{"docs":{},"n":{"docs":{},"i":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.006134969325153374}},"i":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}}}}},"s":{"1":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}},"(":{"docs":{},"(":{"docs":{},"p":{"docs":{},"y":{"docs":{},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}}}}},"p":{"docs":{},"y":{"docs":{},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}}}}}},"docs":{},"t":{"docs":{},"a":{"docs":{},"l":{"docs":{"./":{"ref":"./","tf":0.006134969325153374},"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182},"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.027777777777777776}}},"n":{"docs":{},"c":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}},"e":{"docs":{},"a":{"docs":{},"d":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}},"e":{"docs":{},"r":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},"d":{"docs":{},"i":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},"(":{"docs":{},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},"m":{"docs":{},"p":{"docs":{},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}},"p":{"docs":{},"y":{"docs":{},"d":{"docs":{},"i":{"docs":{},"c":{"docs":{},"t":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},".":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}},"c":{"docs":{},"l":{"docs":{},"u":{"docs":{},"d":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.011363636363636364},"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},"e":{"docs":{},"/":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},".":{"docs":{},"h":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.010101010101010102}}}}}}}}}},"d":{"docs":{},"i":{"docs":{},"c":{"docs":{},"t":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},".":{"docs":{},"h":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}},"s":{"docs":{},"i":{"docs":{},"v":{"docs":{},"e":{"docs":{},")":{"docs":{},".":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}},"r":{"docs":{},"e":{"docs":{},"m":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}},"t":{"8":{"docs":{},"_":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}},"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.02127659574468085},"objects/long-object/":{"ref":"objects/long-object/","tf":0.00676818950930626},"objects/list-object/":{"ref":"objects/list-object/","tf":0.010973936899862825},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0036330608537693005},"objects/set-object/":{"ref":"objects/set-object/","tf":0.007180156657963447}},"\"":{"docs":{},")":{"docs":{},";":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425}}}}},"'":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425}}},"e":{"docs":{},"r":{"docs":{},"n":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}},"g":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0025380710659898475}},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},".":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}}}}}}}},".":{"docs":{},"_":{"docs":{},"_":{"docs":{},"n":{"docs":{},"e":{"docs":{},"w":{"docs":{},"_":{"docs":{},"_":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}},"_":{"docs":{},"i":{"docs":{},"n":{"docs":{},"f":{"docs":{},"o":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}},"r":{"docs":{},"i":{"docs":{},"n":{"docs":{},"s":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}},"d":{"docs":{},"e":{"docs":{},"x":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.004541326067211626},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0019582245430809398}},"e":{"docs":{},"r":{"docs":{},"r":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}},")":{"docs":{},";":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}},">":{"docs":{},"=":{"0":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},"docs":{}}},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},",":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}},"i":{"docs":{},"c":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.004541326067211626}}}}},"p":{"docs":{},"u":{"docs":{},"t":{"docs":{},"=":{"2":{"docs":{},"d":{"docs":{},"c":{"2":{"docs":{},"b":{"docs":{},"a":{"5":{"docs":{},"b":{"docs":{},"b":{"2":{"docs":{},"f":{"docs":{},"b":{"1":{"docs":{},"f":{"8":{"2":{"docs":{},"]":{"docs":{},"*":{"docs":{},"/":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}},"docs":{}},"docs":{}}},"docs":{}}}},"docs":{}}}},"docs":{}}}},"docs":{}}}},"8":{"1":{"docs":{},"c":{"9":{"8":{"docs":{},"f":{"4":{"1":{"8":{"docs":{},"a":{"docs":{},"f":{"9":{"docs":{},"e":{"docs":{},"b":{"6":{"docs":{},"f":{"docs":{},"]":{"docs":{},"*":{"docs":{},"/":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}},"docs":{}}}},"docs":{}}}},"docs":{}},"docs":{}},"docs":{}}},"docs":{}},"docs":{}}},"docs":{}},"docs":{}},"]":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}}}}}},"v":{"docs":{},"a":{"docs":{},"r":{"docs":{},"i":{"docs":{},"a":{"docs":{},"n":{"docs":{},"t":{"docs":{},"s":{"docs":{},":":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}},"f":{"docs":{},"o":{"docs":{},"r":{"docs":{},"m":{"docs":{},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},".":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}},"m":{"docs":{},"p":{"docs":{},"l":{"docs":{},"e":{"docs":{},"m":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}},"t":{"docs":{},"e":{"docs":{},"m":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0013623978201634877}},"s":{"docs":{},";":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}},"[":{"docs":{},"i":{"docs":{},"+":{"1":{"docs":{},"]":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}},"docs":{}},"]":{"docs":{},";":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}},"w":{"docs":{},"h":{"docs":{},"e":{"docs":{},"r":{"docs":{},"e":{"docs":{},"]":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}},")":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}},"r":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{},"e":{"docs":{},")":{"docs":{},")":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}},",":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}},"+":{"1":{"docs":{},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}},",":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}},"docs":{}},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/list-object/":{"ref":"objects/list-object/","tf":0.00411522633744856},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}},"=":{"0":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}},"docs":{}},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},")":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}}},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}},")":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"s":{"docs":{},":":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}},"s":{"docs":{},"u":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"_":{"docs":{},"o":{"docs":{},"l":{"docs":{},"d":{"docs":{},"t":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{},"e":{"docs":{},"_":{"docs":{},"m":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"e":{"docs":{},"d":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}}}},"f":{"docs":{},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"x":{"1":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.006134969325153374},"objects/list-object/":{"ref":"objects/list-object/","tf":3.3388203017832643},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"\"":{"docs":{},")":{"docs":{},";":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}}}}},".":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}},"[":{"0":{"docs":{},"]":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}},"docs":{}},"_":{"docs":{},"r":{"docs":{},"e":{"docs":{},"m":{"docs":{},"o":{"docs":{},"v":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}},"e":{"docs":{},"(":{"docs":{},"p":{"docs":{},"y":{"docs":{},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}}}}},"函":{"docs":{},"数":{"docs":{},"会":{"docs":{},"遍":{"docs":{},"历":{"docs":{},"列":{"docs":{},"表":{"docs":{},",":{"docs":{},"使":{"docs":{},"用":{"docs":{},"p":{"docs":{},"y":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},"_":{"docs":{},"r":{"docs":{},"i":{"docs":{},"c":{"docs":{},"h":{"docs":{},"c":{"docs":{},"o":{"docs":{},"m":{"docs":{},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"e":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"l":{"docs":{},"与":{"docs":{},"目":{"docs":{},"标":{"docs":{},"值":{"docs":{},"进":{"docs":{},"行":{"docs":{},"比":{"docs":{},"较":{"docs":{},",":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},",":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}},"s":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},"(":{"docs":{},"p":{"docs":{},"y":{"docs":{},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}}}}}}}}}}}},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},".":{"docs":{},"c":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.006858710562414266}}},"h":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}},"b":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.011363636363636364},"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}},"/":{"docs":{},"p":{"docs":{},"y":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"n":{"3":{"docs":{},".":{"7":{"docs":{},"/":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"f":{"docs":{},"i":{"docs":{},"g":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}}}}}}},"docs":{}}},"docs":{}}}}}}}},"b":{"docs":{},"z":{"2":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}},"docs":{}}},"f":{"docs":{},"f":{"docs":{},"i":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.013888888888888888}}}}},"g":{"docs":{},"d":{"docs":{},"b":{"docs":{},"m":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}}},"p":{"docs":{},"y":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"n":{"3":{"docs":{},".":{"7":{"docs":{},"m":{"docs":{},".":{"docs":{},"a":{"docs":{},",":{"docs":{},"该":{"docs":{},"静":{"docs":{},"态":{"docs":{},"库":{"docs":{},"用":{"docs":{},"于":{"docs":{},"使":{"docs":{},"用":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}}}}}}}}}}}},"docs":{}}},"docs":{}}}}}}},"r":{"docs":{},"e":{"docs":{},"a":{"docs":{},"d":{"docs":{},"l":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"6":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.009259259259259259}}},"docs":{}}}}}}}}},"s":{"docs":{},"q":{"docs":{},"l":{"docs":{},"i":{"docs":{},"t":{"docs":{},"e":{"3":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}},"docs":{}}}}}},"s":{"docs":{},"l":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}},"u":{"docs":{},"u":{"docs":{},"i":{"docs":{},"d":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.009259259259259259}}}}}}},"c":{"docs":{},"e":{"docs":{},"n":{"docs":{},"s":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}},"n":{"docs":{},"u":{"docs":{},"x":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.013888888888888888},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"e":{"docs":{},"a":{"docs":{},"r":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}},"_":{"docs":{},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"b":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}}}}}}}}}},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0025380710659898475},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}},"_":{"docs":{},"t":{"docs":{},"o":{"docs":{},"_":{"docs":{},"d":{"docs":{},"e":{"docs":{},"c":{"docs":{},"i":{"docs":{},"m":{"docs":{},"a":{"docs":{},"l":{"docs":{},"_":{"docs":{},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"(":{"docs":{},"p":{"docs":{},"y":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425}}}}}}}}}}},",":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}}},"_":{"docs":{},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"n":{"docs":{},"a":{"docs":{},"l":{"docs":{},"(":{"docs":{},"p":{"docs":{},"y":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}},"中":{"docs":{},"添":{"docs":{},"加":{"docs":{},"如":{"docs":{},"下":{"docs":{},"代":{"docs":{},"码":{"docs":{},"并":{"docs":{},"重":{"docs":{},"新":{"docs":{},"编":{"docs":{},"译":{"docs":{},"安":{"docs":{},"装":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"r":{"docs":{},"u":{"docs":{},"e":{"docs":{},"_":{"docs":{},"d":{"docs":{},"i":{"docs":{},"v":{"docs":{},"i":{"docs":{},"d":{"docs":{},"e":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}},"a":{"docs":{},"s":{"docs":{},"_":{"docs":{},"n":{"docs":{},"u":{"docs":{},"m":{"docs":{},"b":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}},"d":{"docs":{},"d":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},"(":{"docs":{},"p":{"docs":{},"y":{"docs":{},"l":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}},"n":{"docs":{},"d":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}},"d":{"docs":{},"e":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{},",":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}},"i":{"docs":{},"v":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}},"m":{"docs":{},"o":{"docs":{},"d":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}},"o":{"docs":{},"c":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}},"f":{"docs":{},"l":{"docs":{},"o":{"docs":{},"a":{"docs":{},"t":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}},"l":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}}}}}},"s":{"docs":{},"h":{"docs":{},"i":{"docs":{},"f":{"docs":{},"t":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"d":{"docs":{},"s":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}},"o":{"docs":{},"d":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}},"u":{"docs":{},"l":{"docs":{},"(":{"docs":{},"p":{"docs":{},"y":{"docs":{},"l":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}}},"n":{"docs":{},"e":{"docs":{},"w":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}},"(":{"docs":{},"p":{"docs":{},"y":{"docs":{},"t":{"docs":{},"y":{"docs":{},"p":{"docs":{},"e":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}},"_":{"docs":{},"i":{"docs":{},"m":{"docs":{},"p":{"docs":{},"l":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}},"(":{"docs":{},"p":{"docs":{},"y":{"docs":{},"t":{"docs":{},"y":{"docs":{},"p":{"docs":{},"e":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}}}}}}}}}}}}}},"t":{"docs":{},"y":{"docs":{},"p":{"docs":{},"e":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}},"o":{"docs":{},"r":{"docs":{},"m":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},"a":{"docs":{},"l":{"docs":{},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},"(":{"docs":{},"z":{"docs":{},")":{"docs":{},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}},"o":{"docs":{},"r":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}},"p":{"docs":{},"o":{"docs":{},"w":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}},"r":{"docs":{},"i":{"docs":{},"c":{"docs":{},"h":{"docs":{},"c":{"docs":{},"o":{"docs":{},"m":{"docs":{},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"e":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}},"s":{"docs":{},"u":{"docs":{},"b":{"docs":{},"t":{"docs":{},"y":{"docs":{},"p":{"docs":{},"e":{"docs":{},"_":{"docs":{},"n":{"docs":{},"e":{"docs":{},"w":{"docs":{},"(":{"docs":{},"t":{"docs":{},"y":{"docs":{},"p":{"docs":{},"e":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}}}},"x":{"docs":{},"o":{"docs":{},"r":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},".":{"docs":{},"h":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},"r":{"docs":{},"e":{"docs":{},"p":{"docs":{},"r":{"docs":{},".":{"docs":{},"h":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}}}}}}}}}}}}},"w":{"docs":{},"e":{"docs":{},"r":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}},"a":{"docs":{},"d":{"docs":{},"_":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0027247956403269754},"objects/set-object/":{"ref":"objects/set-object/","tf":0.00587467362924282}}}}}}},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"d":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0013623978201634877},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0032637075718015664}}}}},"a":{"docs":{},"t":{"docs":{},"t":{"docs":{},"r":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0032637075718015664}}}}}}}}},"o":{"docs":{},"k":{"docs":{},"d":{"docs":{},"i":{"docs":{},"c":{"docs":{},"t":{"docs":{},"(":{"docs":{},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},":":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"m":{"docs":{},"p":{"docs":{},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},"_":{"docs":{},"s":{"docs":{},"p":{"docs":{},"l":{"docs":{},"i":{"docs":{},"t":{"docs":{},"(":{"docs":{},")":{"docs":{},":":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}},"u":{"docs":{},"n":{"docs":{},"i":{"docs":{},"c":{"docs":{},"o":{"docs":{},"d":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},"e":{"docs":{},"(":{"docs":{},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},":":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}},"_":{"docs":{},"n":{"docs":{},"o":{"docs":{},"d":{"docs":{},"u":{"docs":{},"m":{"docs":{},"m":{"docs":{},"y":{"docs":{},"(":{"docs":{},")":{"docs":{},":":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"p":{"docs":{},"y":{"docs":{},"d":{"docs":{},"i":{"docs":{},"c":{"docs":{},"t":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}}}},"u":{"docs":{},"p":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"a":{"docs":{},"y":{"docs":{},"e":{"docs":{},"r":{"docs":{},")":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.002886002886002886}}}}},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"r":{"docs":{},"g":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"e":{"docs":{},"r":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}}},"s":{"docs":{},"t":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}},"s":{"docs":{},"t":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0054869684499314125}},".":{"docs":{},"a":{"docs":{},"p":{"docs":{},"p":{"docs":{},"e":{"docs":{},"n":{"docs":{},"d":{"docs":{},"(":{"1":{"docs":{},")":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}},"docs":{}}}}}}}},"r":{"docs":{},"e":{"docs":{},"m":{"docs":{},"o":{"docs":{},"v":{"docs":{},"e":{"docs":{},"(":{"3":{"docs":{},")":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}}}},"docs":{}}}}}}}}},"[":{"0":{"docs":{},"]":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}}}},"3":{"docs":{},"]":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}},"docs":{}}}},"e":{"docs":{},"n":{"docs":{},"(":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},")":{"docs":{},",":{"docs":{},"和":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}},"m":{"4":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}},"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0018165304268846503},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"a":{"docs":{},"k":{"docs":{},"e":{"docs":{"./":{"ref":"./","tf":0.03680981595092025},"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.013888888888888888},"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.02127659574468085},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"f":{"docs":{},"i":{"docs":{},"l":{"docs":{},"e":{"docs":{},".":{"docs":{},"p":{"docs":{},"r":{"docs":{},"e":{"docs":{},".":{"docs":{},"i":{"docs":{},"n":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}}}}}}}}},"_":{"docs":{},"n":{"docs":{},"e":{"docs":{},"w":{"docs":{},"_":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"(":{"docs":{},"&":{"docs":{},"p":{"docs":{},"y":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"_":{"docs":{},"t":{"docs":{},"y":{"docs":{},"p":{"docs":{},"e":{"docs":{},",":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}},"p":{"docs":{},"y":{"docs":{},"t":{"docs":{},"y":{"docs":{},"p":{"docs":{},"e":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}}}}}}},"c":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182},"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}},"o":{"docs":{},"s":{"docs":{},",":{"docs":{},"执":{"docs":{},"行":{"docs":{},":":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}}}}}},"t":{"docs":{},"h":{"docs":{},"、":{"docs":{},"h":{"docs":{},"a":{"docs":{},"s":{"docs":{},"h":{"docs":{},"l":{"docs":{},"i":{"docs":{},"b":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}}}}}}}},"p":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.002886002886002886}}},"l":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}},"'":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}},"_":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0013623978201634877}},"s":{"docs":{},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},".":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"d":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"u":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0018165304268846503}}}}},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"_":{"docs":{},"t":{"docs":{},"a":{"docs":{},"g":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"_":{"docs":{},"t":{"docs":{},"r":{"docs":{},"a":{"docs":{},"c":{"docs":{},"k":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"(":{"docs":{},"m":{"docs":{},"p":{"docs":{},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}},"s":{"docs":{},"k":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0039164490861618795}},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0039164490861618795}}},",":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}},"x":{"docs":{},"_":{"docs":{},"p":{"docs":{},"r":{"docs":{},"e":{"docs":{},"s":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}},"i":{"docs":{},"s":{"docs":{},"c":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}},"s":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}},"l":{"docs":{},"d":{"docs":{},",":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}},"n":{"docs":{},"s":{"docs":{},"i":{"docs":{},"z":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}},"u":{"docs":{},"s":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},"e":{"docs":{},"d":{"docs":{},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},".":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}},"o":{"docs":{},"d":{"docs":{},"u":{"docs":{},"l":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.011363636363636364}}}},"i":{"docs":{},"f":{"docs":{},"i":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"r":{"docs":{},"e":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}},"e":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"d":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.002886002886002886}}}}}},"_":{"docs":{},"h":{"docs":{},"a":{"docs":{},"s":{"docs":{},"h":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},".":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"u":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}}}}}}},"a":{"docs":{},"n":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"d":{"docs":{},"i":{"docs":{},"u":{"docs":{},"m":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"m":{"docs":{},"o":{"docs":{},"r":{"docs":{},"y":{"docs":{},"e":{"docs":{},"r":{"docs":{},"r":{"docs":{},"o":{"docs":{},"r":{"docs":{},".":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}},"i":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"(":{"docs":{},"&":{"docs":{},"d":{"docs":{},"k":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}},"d":{"docs":{},"k":{"docs":{},"_":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"r":{"docs":{},"i":{"docs":{},"e":{"docs":{},"s":{"docs":{},"(":{"docs":{},"d":{"docs":{},"k":{"docs":{},")":{"docs":{},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}},"n":{"docs":{},"e":{"docs":{},"w":{"docs":{},"t":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{},"e":{"docs":{},",":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}},"c":{"docs":{},"p":{"docs":{},"y":{"docs":{},"(":{"docs":{},"s":{"docs":{},"m":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"_":{"docs":{},"c":{"docs":{},"o":{"docs":{},"p":{"docs":{},"y":{"docs":{},",":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{},"i":{"docs":{},"p":{"docs":{},"l":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}},"p":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.01226158038147139}},"_":{"docs":{},"a":{"docs":{},"s":{"docs":{},"s":{"docs":{},"_":{"docs":{},"s":{"docs":{},"u":{"docs":{},"b":{"docs":{},"s":{"docs":{},"c":{"docs":{},"r":{"docs":{},"i":{"docs":{},"p":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}}}}}}}}}}}}}}}}}},"n":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}},"o":{"docs":{},"d":{"docs":{},"e":{"docs":{"./":{"ref":"./","tf":0.006134969325153374}}}},"t":{"docs":{},"e":{"docs":{},":":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}},"n":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"p":{"docs":{},"m":{"docs":{"./":{"ref":"./","tf":0.03067484662576687}}}},"u":{"docs":{},"l":{"docs":{},"l":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.00338409475465313},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.002270663033605813},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0019582245430809398}},")":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425},"objects/long-object/":{"ref":"objects/long-object/","tf":0.005922165820642978},"objects/list-object/":{"ref":"objects/list-object/","tf":0.006858710562414266},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0027247956403269754},"objects/set-object/":{"ref":"objects/set-object/","tf":0.008485639686684074}},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0027247956403269754},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},")":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}},",":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.02127659574468085},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}}},";":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425},"objects/long-object/":{"ref":"objects/long-object/","tf":0.005922165820642978},"objects/list-object/":{"ref":"objects/list-object/","tf":0.006858710562414266},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0013623978201634877},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0026109660574412533}}},"}":{"docs":{},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}},"_":{"docs":{},"e":{"docs":{},"r":{"docs":{},"r":{"docs":{},"o":{"docs":{},"r":{"docs":{},"(":{"docs":{},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}},"m":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},"b":{"docs":{},"e":{"docs":{},"r":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0013623978201634877},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}}},"e":{"docs":{},"r":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}},"_":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"d":{"docs":{},"_":{"docs":{},"b":{"docs":{},"y":{"docs":{},"t":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}},"e":{"docs":{},"s":{"docs":{},")":{"docs":{},";":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}},";":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}}}}}}}}},"f":{"docs":{},"r":{"docs":{},"e":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}},"e":{"docs":{},"]":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},"s":{"docs":{},"]":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}},"b":{"docs":{},"_":{"docs":{},"i":{"docs":{},"n":{"docs":{},"p":{"docs":{},"l":{"docs":{},"a":{"docs":{},"c":{"docs":{},"e":{"docs":{},"_":{"docs":{},"m":{"docs":{},"a":{"docs":{},"t":{"docs":{},"r":{"docs":{},"i":{"docs":{},"x":{"docs":{},"_":{"docs":{},"m":{"docs":{},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{},"i":{"docs":{},"p":{"docs":{},"l":{"docs":{},"y":{"docs":{},";":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{},"i":{"docs":{},"p":{"docs":{},"l":{"docs":{},"i":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}},"a":{"docs":{},"d":{"docs":{},"d":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}},"n":{"docs":{},"d":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}},"f":{"docs":{},"l":{"docs":{},"o":{"docs":{},"o":{"docs":{},"r":{"docs":{},"_":{"docs":{},"d":{"docs":{},"i":{"docs":{},"v":{"docs":{},"i":{"docs":{},"d":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}},"l":{"docs":{},"s":{"docs":{},"h":{"docs":{},"i":{"docs":{},"f":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}},"o":{"docs":{},"r":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}},"p":{"docs":{},"o":{"docs":{},"w":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}},"r":{"docs":{},"e":{"docs":{},"m":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"d":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}},"s":{"docs":{},"h":{"docs":{},"i":{"docs":{},"f":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}},"s":{"docs":{},"u":{"docs":{},"b":{"docs":{},"t":{"docs":{},"r":{"docs":{},"a":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}},"t":{"docs":{},"r":{"docs":{},"u":{"docs":{},"e":{"docs":{},"_":{"docs":{},"d":{"docs":{},"i":{"docs":{},"v":{"docs":{},"i":{"docs":{},"d":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}},"x":{"docs":{},"o":{"docs":{},"r":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}},"d":{"docs":{},"e":{"docs":{},"x":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}},"m":{"docs":{},"a":{"docs":{},"t":{"docs":{},"r":{"docs":{},"i":{"docs":{},"x":{"docs":{},"_":{"docs":{},"m":{"docs":{},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{},"i":{"docs":{},"p":{"docs":{},"l":{"docs":{},"y":{"docs":{},";":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}},"f":{"docs":{},"l":{"docs":{},"o":{"docs":{},"o":{"docs":{},"r":{"docs":{},"_":{"docs":{},"d":{"docs":{},"i":{"docs":{},"v":{"docs":{},"i":{"docs":{},"d":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}},"t":{"docs":{},"r":{"docs":{},"u":{"docs":{},"e":{"docs":{},"_":{"docs":{},"d":{"docs":{},"i":{"docs":{},"v":{"docs":{},"i":{"docs":{},"d":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}},"d":{"docs":{},"i":{"docs":{},"g":{"docs":{},"i":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}},"e":{"docs":{},"g":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"v":{"docs":{},"e":{"docs":{},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}},"w":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"_":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.006858710562414266}},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"d":{"docs":{},",":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}},";":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}},"d":{"docs":{},"i":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}},"(":{"docs":{},"p":{"docs":{},"y":{"docs":{},"d":{"docs":{},"i":{"docs":{},"c":{"docs":{},"t":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},"s":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}}}},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},"s":{"docs":{},"_":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}},"i":{"docs":{},"t":{"docs":{},"e":{"docs":{},"m":{"docs":{},")":{"docs":{},";":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.00411522633744856}}}}}}}},"s":{"docs":{},"i":{"docs":{},"z":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0054869684499314125},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}},"e":{"docs":{},")":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}},".":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}},";":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"m":{"docs":{},"a":{"docs":{},"s":{"docs":{},"k":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},",":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}},"t":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}},"e":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}},"c":{"docs":{},"e":{"docs":{},"s":{"docs":{},"s":{"docs":{},"a":{"docs":{},"r":{"docs":{},"i":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}},"e":{"docs":{},"d":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"e":{"docs":{},"d":{"docs":{},".":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}},"u":{"docs":{},"t":{"docs":{},"r":{"docs":{},"a":{"docs":{},"l":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}},"s":{"docs":{},"m":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"n":{"docs":{},"e":{"docs":{},"g":{"docs":{},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.005922165820642978}},"s":{"docs":{},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}},"p":{"docs":{},"o":{"docs":{},"s":{"docs":{},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.004230118443316413}},"s":{"docs":{},"]":{"docs":{},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}},")":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}},"+":{"1":{"docs":{},")":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}}}},"docs":{}},";":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}}}},"p":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}},"y":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"n":{"docs":{"./":{"ref":"./","tf":0.15950920245398773},"preface/code-organization/":{"ref":"preface/code-organization/","tf":5.113636363636363},"preface/windows-build/":{"ref":"preface/windows-build/","tf":3.45662100456621},"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":3.3888888888888884},"preface/modify-code/":{"ref":"preface/modify-code/","tf":3.3758865248226946},"objects/object/":{"ref":"objects/object/","tf":5.03030303030303},"objects/long-object/":{"ref":"objects/long-object/","tf":5.001692047377326},"objects/list-object/":{"ref":"objects/list-object/","tf":3.334705075445816},"objects/dict-object/":{"ref":"objects/dict-object/","tf":3.338782924613987},"objects/set-object/":{"ref":"objects/set-object/","tf":3.3365970409051346},"objects/simple-interpreter/":{"ref":"objects/simple-interpreter/","tf":5.071428571428571}},",":{"docs":{},"那":{"docs":{},"么":{"docs":{},"就":{"docs":{},"需":{"docs":{},"要":{"docs":{},"用":{"docs":{},"到":{"docs":{},"这":{"docs":{},"里":{"docs":{},"提":{"docs":{},"供":{"docs":{},"的":{"docs":{},"头":{"docs":{},"文":{"docs":{},"件":{"docs":{},"。":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}}}}}}}}}}}}}},"右":{"docs":{},"键":{"docs":{},"选":{"docs":{},"择":{"docs":{},"“":{"docs":{},"生":{"docs":{},"成":{"docs":{},"”":{"docs":{},",":{"docs":{},"以":{"docs":{},"进":{"docs":{},"行":{"docs":{},"编":{"docs":{},"译":{"docs":{},":":{"docs":{"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863}}}}}}}}}}}}}}}}},"输":{"docs":{},"入":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425}}}}},"c":{"docs":{},"o":{"docs":{},"r":{"docs":{},"e":{"docs":{},",":{"docs":{},"然":{"docs":{},"后":{"docs":{},"点":{"docs":{},"击":{"docs":{},"“":{"docs":{},"确":{"docs":{},"定":{"docs":{},"”":{"docs":{},"(":{"docs":{},"如":{"docs":{},"下":{"docs":{},"图":{"docs":{},"所":{"docs":{},"示":{"docs":{},")":{"docs":{},"。":{"docs":{"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863}}}}}}}}}}}}}}}}}}}}}}},"/":{"docs":{},"c":{"docs":{},"e":{"docs":{},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},".":{"docs":{},"c":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}},"y":{"docs":{},"p":{"docs":{},"e":{"docs":{},"_":{"docs":{},"t":{"docs":{},"y":{"docs":{},"p":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.005772005772005772}},"e":{"docs":{},"创":{"docs":{},"建":{"docs":{},"的":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.012987012987012988},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},";":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}},"t":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.002886002886002886}}}}}}}}}}},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"f":{"docs":{},"i":{"docs":{},"g":{"docs":{},".":{"docs":{},"h":{"docs":{},".":{"docs":{},"i":{"docs":{},"n":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}}}}}}}}},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.031914893617021274},"objects/object/":{"ref":"objects/object/","tf":0.010101010101010102},"objects/long-object/":{"ref":"objects/long-object/","tf":0.016074450084602367},"objects/list-object/":{"ref":"objects/list-object/","tf":0.01783264746227709},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.01044504995458674},"objects/set-object/":{"ref":"objects/set-object/","tf":0.012402088772845953}},"_":{"docs":{},"p":{"docs":{},"r":{"docs":{},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425}},"(":{"docs":{},"p":{"docs":{},"y":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425}}}}}}}}}},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{},",":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425}}}}}}}}}}}},"h":{"docs":{},"e":{"docs":{},"a":{"docs":{},"d":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"_":{"docs":{},"i":{"docs":{},"n":{"docs":{},"i":{"docs":{},"t":{"docs":{},"(":{"docs":{},"t":{"docs":{},"y":{"docs":{},"p":{"docs":{},"e":{"docs":{},")":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}},"a":{"docs":{},"s":{"docs":{},"h":{"docs":{},"(":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"1":{"docs":{},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}},"docs":{},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}}}}}}}}}},"n":{"docs":{},"e":{"docs":{},"w":{"docs":{},"(":{"docs":{},"p":{"docs":{},"y":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},",":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}},"v":{"docs":{},"a":{"docs":{},"r":{"docs":{},"_":{"docs":{},"h":{"docs":{},"e":{"docs":{},"a":{"docs":{},"d":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.002886002886002886},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}},"d":{"docs":{},"e":{"docs":{},"l":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}},"g":{"docs":{},"e":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"i":{"docs":{},"c":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},"a":{"docs":{},"t":{"docs":{},"t":{"docs":{},"r":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}},"c":{"docs":{},"_":{"docs":{},"n":{"docs":{},"e":{"docs":{},"w":{"docs":{},"(":{"docs":{},"p":{"docs":{},"y":{"docs":{},"d":{"docs":{},"i":{"docs":{},"c":{"docs":{},"t":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}}},"m":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{},"(":{"docs":{},"s":{"docs":{},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},"o":{"docs":{},"f":{"docs":{},"(":{"docs":{},"p":{"docs":{},"y":{"docs":{},"d":{"docs":{},"i":{"docs":{},"c":{"docs":{},"t":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},"s":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"i":{"docs":{},"t":{"docs":{},"e":{"docs":{},"m":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},"(":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}},"p":{"docs":{},"y":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}},"r":{"docs":{},"i":{"docs":{},"c":{"docs":{},"h":{"docs":{},"c":{"docs":{},"o":{"docs":{},"m":{"docs":{},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"e":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"l":{"docs":{},"(":{"docs":{},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},",":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}}}}}}}}}}}}}}}}}}}}}}}}}},"*":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.004329004329004329},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0013623978201634877}}},";":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.002886002886002886}}}}}}}}},"u":{"docs":{},"n":{"docs":{},"i":{"docs":{},"c":{"docs":{},"o":{"docs":{},"d":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},"e":{"docs":{},"_":{"docs":{},"f":{"docs":{},"r":{"docs":{},"o":{"docs":{},"m":{"docs":{},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425}},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"(":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}},"\"":{"docs":{},"i":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425}}}}}}}}}}}}}}},"t":{"docs":{},"y":{"docs":{},"p":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}},"k":{"docs":{},"i":{"docs":{},"n":{"docs":{},"d":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}},"c":{"docs":{},"h":{"docs":{},"e":{"docs":{},"c":{"docs":{},"k":{"docs":{},"e":{"docs":{},"x":{"docs":{},"a":{"docs":{},"c":{"docs":{},"t":{"docs":{},"(":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},")":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}}}}}}}}}}}}}}}},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}},"*":{"docs":{},",":{"docs":{},"那":{"docs":{},"么":{"docs":{},"就":{"docs":{},"会":{"docs":{},"调":{"docs":{},"用":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}}}}}},"_":{"docs":{},"d":{"docs":{},"e":{"docs":{},"c":{"docs":{},"r":{"docs":{},"e":{"docs":{},"f":{"docs":{},"(":{"docs":{},"o":{"docs":{},"p":{"docs":{},")":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}},";":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}},"l":{"docs":{},"d":{"docs":{},"_":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},")":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}}}}},"m":{"docs":{},"a":{"docs":{},"p":{"docs":{},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"p":{"docs":{},"o":{"docs":{},"p":{"docs":{},"(":{"docs":{},")":{"docs":{},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}}}}}}}}},"s":{"docs":{},"u":{"docs":{},"b":{"docs":{},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"e":{"docs":{},"t":{"docs":{},")":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}},"o":{"docs":{},")":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}},"t":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},")":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}}}}}}}}}},"v":{"docs":{},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"a":{"docs":{},"l":{"docs":{},"u":{"docs":{},"e":{"docs":{},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}},"i":{"docs":{},"t":{"docs":{},"e":{"docs":{},"m":{"docs":{},")":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}},"将":{"docs":{},"调":{"docs":{},"用":{"docs":{},"该":{"docs":{},"对":{"docs":{},"象":{"docs":{},"的":{"docs":{},"t":{"docs":{},"p":{"docs":{},"_":{"docs":{},"d":{"docs":{},"e":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{},"来":{"docs":{},"释":{"docs":{},"放":{"docs":{},"对":{"docs":{},"象":{"docs":{},"所":{"docs":{},"占":{"docs":{},"用":{"docs":{},"的":{"docs":{},"内":{"docs":{},"存":{"docs":{},"和":{"docs":{},"系":{"docs":{},"统":{"docs":{},"资":{"docs":{},"源":{"docs":{},";":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"h":{"docs":{},"a":{"docs":{},"s":{"docs":{},"h":{"docs":{},"_":{"docs":{},"t":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.002886002886002886},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.002270663033605813},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0045691906005221935}}}}}}}},"i":{"docs":{},"n":{"docs":{},"c":{"docs":{},"r":{"docs":{},"e":{"docs":{},"f":{"docs":{},"(":{"docs":{},"o":{"docs":{},"p":{"docs":{},")":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}},"与":{"docs":{},"p":{"docs":{},"y":{"docs":{},"_":{"docs":{},"d":{"docs":{},"e":{"docs":{},"c":{"docs":{},"r":{"docs":{},"e":{"docs":{},"f":{"docs":{},"(":{"docs":{},"o":{"docs":{},"p":{"docs":{},")":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}},"v":{"docs":{},")":{"docs":{},";":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}},"a":{"docs":{},"l":{"docs":{},"u":{"docs":{},"e":{"docs":{},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},")":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}}}}}}}}}}}}}}}}},"r":{"docs":{},"e":{"docs":{},"f":{"docs":{},"c":{"docs":{},"n":{"docs":{},"t":{"docs":{},"(":{"docs":{},"o":{"docs":{},"p":{"docs":{},")":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}},"a":{"docs":{},"n":{"docs":{},"y":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},")":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}},"t":{"docs":{},"u":{"docs":{},"r":{"docs":{},"n":{"docs":{},"_":{"docs":{},"n":{"docs":{},"o":{"docs":{},"n":{"docs":{},"e":{"docs":{},";":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}}}},"s":{"docs":{},"s":{"docs":{},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},"_":{"docs":{},"t":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.005772005772005772},"objects/long-object/":{"ref":"objects/long-object/","tf":0.005922165820642978},"objects/list-object/":{"ref":"objects/list-object/","tf":0.012345679012345678},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.006357856494096276},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0039164490861618795}},"_":{"docs":{},"m":{"docs":{},"a":{"docs":{},"x":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}},")":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}}}}}}}}}}}}},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},"(":{"docs":{},"a":{"docs":{},")":{"docs":{},")":{"docs":{},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}},"v":{"docs":{},")":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}},"o":{"docs":{},"p":{"docs":{},")":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}},")":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}}}}}},"s":{"docs":{},"e":{"docs":{},"l":{"docs":{},"f":{"docs":{},")":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}},";":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}}},"t":{"docs":{},"r":{"docs":{},"a":{"docs":{},"c":{"docs":{},"e":{"docs":{},"_":{"docs":{},"r":{"docs":{},"e":{"docs":{},"f":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}},"p":{"docs":{},"f":{"docs":{},"l":{"docs":{},"a":{"docs":{},"g":{"docs":{},"s":{"docs":{},"_":{"docs":{},"b":{"docs":{},"a":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"y":{"docs":{},"p":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}},"d":{"docs":{},"e":{"docs":{},"f":{"docs":{},"a":{"docs":{},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}},"l":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"_":{"docs":{},"s":{"docs":{},"u":{"docs":{},"b":{"docs":{},"c":{"docs":{},"l":{"docs":{},"a":{"docs":{},"s":{"docs":{},"s":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}}}}}}}}},"a":{"docs":{},"b":{"docs":{},"s":{"docs":{},"(":{"docs":{},"p":{"docs":{},"y":{"docs":{},"_":{"docs":{},"s":{"docs":{},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},"(":{"docs":{},"a":{"docs":{},")":{"docs":{},")":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}}}}}},"b":{"docs":{},")":{"docs":{},")":{"docs":{},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}}}}}}}}}}}}}}}}},"t":{"docs":{},"e":{"docs":{},"x":{"docs":{},"i":{"docs":{},"t":{"docs":{},"(":{"docs":{},"s":{"docs":{},"h":{"docs":{},"o":{"docs":{},"w":{"docs":{},"_":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{},")":{"docs":{},";":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}}}}}}}}}}},"e":{"docs":{},"q":{"docs":{},")":{"docs":{},";":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}}}},"x":{"docs":{},"d":{"docs":{},"e":{"docs":{},"c":{"docs":{},"r":{"docs":{},"e":{"docs":{},"f":{"docs":{},"(":{"docs":{},"n":{"docs":{},"e":{"docs":{},"w":{"docs":{},"i":{"docs":{},"t":{"docs":{},"e":{"docs":{},"m":{"docs":{},")":{"docs":{},";":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}}}}}}}}}}},"o":{"docs":{},"l":{"docs":{},"d":{"docs":{},"_":{"docs":{},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"u":{"docs":{},"e":{"docs":{},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"r":{"docs":{},"e":{"docs":{},"f":{"docs":{},"(":{"docs":{},"*":{"docs":{},"p":{"docs":{},",":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}}},"u":{"docs":{},"n":{"docs":{},"r":{"docs":{},"e":{"docs":{},"a":{"docs":{},"c":{"docs":{},"h":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{},"e":{"docs":{},"(":{"docs":{},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}},"a":{"docs":{},"s":{"docs":{},"y":{"docs":{},"n":{"docs":{},"c":{"docs":{},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"d":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}},"l":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"_":{"docs":{},"f":{"docs":{},"r":{"docs":{},"o":{"docs":{},"m":{"docs":{},"l":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},"(":{"0":{"docs":{},")":{"docs":{},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}},"l":{"docs":{},")":{"docs":{},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}},"1":{"0":{"docs":{},")":{"docs":{},";":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}},"docs":{},")":{"docs":{},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}},"2":{"0":{"0":{"0":{"0":{"docs":{},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}},"docs":{}},"docs":{}},"docs":{}},"docs":{}},"docs":{},"l":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}},",":{"docs":{},"就":{"docs":{},"不":{"docs":{},"一":{"docs":{},"一":{"docs":{},"列":{"docs":{},"举":{"docs":{},"了":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}}}}},"u":{"docs":{},"n":{"docs":{},"i":{"docs":{},"c":{"docs":{},"o":{"docs":{},"d":{"docs":{},"e":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},",":{"docs":{},"最":{"docs":{},"终":{"docs":{},"调":{"docs":{},"用":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}}}}}}}}},"t":{"docs":{},"y":{"docs":{},"p":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.007215007215007215},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0025380710659898475}},"e":{"docs":{},"中":{"docs":{},"t":{"docs":{},"p":{"docs":{},"_":{"docs":{},"a":{"docs":{},"s":{"docs":{},"_":{"docs":{},"n":{"docs":{},"u":{"docs":{},"m":{"docs":{},"b":{"docs":{},"e":{"docs":{},"r":{"docs":{},".":{"docs":{},"n":{"docs":{},"b":{"docs":{},"_":{"docs":{},"a":{"docs":{},"d":{"docs":{},"d":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}}}}}}}}},"m":{"docs":{},"a":{"docs":{},"s":{"docs":{},"k":{"docs":{},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.00338409475465313}}}}}}},"s":{"docs":{},"h":{"docs":{},"i":{"docs":{},"f":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}},".":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.00338409475465313}}}}}}}}},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.002886002886002886},"objects/long-object/":{"ref":"objects/long-object/","tf":0.016074450084602367}},"*":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},",":{"docs":{},"那":{"docs":{},"么":{"docs":{},"它":{"docs":{},"会":{"docs":{},"调":{"docs":{},"用":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"_":{"docs":{},"a":{"docs":{},"p":{"docs":{},"p":{"docs":{},"e":{"docs":{},"n":{"docs":{},"d":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.00411522633744856}},"(":{"docs":{},"p":{"docs":{},"y":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}}}}}}},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},"_":{"docs":{},"s":{"docs":{},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},"(":{"docs":{},"s":{"docs":{},"e":{"docs":{},"l":{"docs":{},"f":{"docs":{},")":{"docs":{},";":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}}}},"i":{"docs":{},"t":{"docs":{},"e":{"docs":{},"m":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.00411522633744856}},"(":{"docs":{},"p":{"docs":{},"y":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}}}}}}}},"i":{"docs":{},"n":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"t":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.00411522633744856}},"(":{"docs":{},"p":{"docs":{},"y":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}}}}}}},"m":{"docs":{},"a":{"docs":{},"x":{"docs":{},"f":{"docs":{},"r":{"docs":{},"e":{"docs":{},"e":{"docs":{},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}}}}}}}}}}}}},"n":{"docs":{},"e":{"docs":{},"w":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}},"(":{"docs":{},"p":{"docs":{},"y":{"docs":{},"_":{"docs":{},"s":{"docs":{},"s":{"docs":{},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},"_":{"docs":{},"t":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}}}}}},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"i":{"docs":{},"t":{"docs":{},"e":{"docs":{},"m":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.00411522633744856}},"(":{"docs":{},"p":{"docs":{},"y":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}}}}}}}}},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.00411522633744856}},"对":{"docs":{},"象":{"docs":{},"的":{"docs":{},"一":{"docs":{},"些":{"docs":{},"操":{"docs":{},"作":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}},"缓":{"docs":{},"冲":{"docs":{},"池":{"docs":{},"默":{"docs":{},"认":{"docs":{},"大":{"docs":{},"小":{"docs":{},"为":{"8":{"0":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}},"docs":{}},"docs":{}}}}}}}}}}}}}}}}}}},"m":{"docs":{},"a":{"docs":{},"p":{"docs":{},"p":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"d":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.004329004329004329},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}},"e":{"docs":{},"m":{"docs":{},"_":{"docs":{},"c":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{},"(":{"docs":{},"s":{"docs":{},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},",":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}}}},"d":{"docs":{},"e":{"docs":{},"l":{"docs":{},"(":{"docs":{},"o":{"docs":{},"l":{"docs":{},"d":{"docs":{},"t":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{},"e":{"docs":{},")":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}},"n":{"docs":{},"e":{"docs":{},"w":{"docs":{},"(":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"r":{"docs":{},"y":{"docs":{},",":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}},"n":{"docs":{},"u":{"docs":{},"m":{"docs":{},"b":{"docs":{},"e":{"docs":{},"r":{"docs":{},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"d":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.007215007215007215},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},"s":{"docs":{},";":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}},"_":{"docs":{},"a":{"docs":{},"s":{"docs":{},"s":{"docs":{},"s":{"docs":{},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},"_":{"docs":{},"t":{"docs":{},"(":{"docs":{},"o":{"docs":{},"b":{"docs":{},"a":{"docs":{},"s":{"docs":{},"e":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}},"l":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},"(":{"docs":{},"x":{"docs":{},")":{"docs":{},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}},"s":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"n":{"docs":{},"c":{"docs":{},"e":{"docs":{},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"d":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.004329004329004329}}}}}}}},"_":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"i":{"docs":{},"t":{"docs":{},"e":{"docs":{},"m":{"docs":{},"(":{"docs":{},"o":{"docs":{},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}},"t":{"docs":{},"_":{"docs":{},"a":{"docs":{},"d":{"docs":{},"d":{"docs":{},"(":{"docs":{},"p":{"docs":{},"y":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},",":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}},",":{"docs":{},"该":{"docs":{},"函":{"docs":{},"数":{"docs":{},"的":{"docs":{},"本":{"docs":{},"质":{"docs":{},"与":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}},"m":{"docs":{},"i":{"docs":{},"n":{"docs":{},"s":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},")":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"默":{"docs":{},"认":{"docs":{},"我":{"docs":{},"8":{"docs":{},",":{"docs":{},"m":{"docs":{},"a":{"docs":{},"s":{"docs":{},"k":{"docs":{},"为":{"docs":{},"7":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}},"n":{"docs":{},"e":{"docs":{},"w":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}},"(":{"docs":{},"n":{"docs":{},"u":{"docs":{},"l":{"docs":{},"l":{"docs":{},")":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}},"p":{"docs":{},"y":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}},"v":{"docs":{},"a":{"docs":{},"r":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}},";":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}},"_":{"docs":{},"h":{"docs":{},"e":{"docs":{},"a":{"docs":{},"d":{"docs":{},"_":{"docs":{},"i":{"docs":{},"n":{"docs":{},"i":{"docs":{},"t":{"docs":{},"(":{"docs":{},"&":{"docs":{},"p":{"docs":{},"y":{"docs":{},"t":{"docs":{},"y":{"docs":{},"p":{"docs":{},"e":{"docs":{},"_":{"docs":{},"t":{"docs":{},"y":{"docs":{},"p":{"docs":{},"e":{"docs":{},",":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.007215007215007215},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}}}}}}}}}}},"也":{"docs":{},"是":{"docs":{},"基":{"docs":{},"于":{"docs":{},"p":{"docs":{},"y":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},"扩":{"docs":{},"展":{"docs":{},"的":{"docs":{},"。":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}},",":{"docs":{},"而":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}},"b":{"docs":{},"y":{"docs":{},"t":{"docs":{},"e":{"docs":{},"a":{"docs":{},"r":{"docs":{},"r":{"docs":{},"a":{"docs":{},"y":{"docs":{},"/":{"docs":{},"p":{"docs":{},"y":{"docs":{},"b":{"docs":{},"y":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}},"e":{"docs":{},"r":{"docs":{},"r":{"docs":{},"_":{"docs":{},"o":{"docs":{},"c":{"docs":{},"c":{"docs":{},"u":{"docs":{},"r":{"docs":{},"r":{"docs":{},"e":{"docs":{},"d":{"docs":{},"(":{"docs":{},")":{"docs":{},")":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"(":{"docs":{},"p":{"docs":{},"y":{"docs":{},"e":{"docs":{},"x":{"docs":{},"c":{"docs":{},"_":{"docs":{},"t":{"docs":{},"y":{"docs":{},"p":{"docs":{},"e":{"docs":{},"e":{"docs":{},"r":{"docs":{},"r":{"docs":{},"o":{"docs":{},"r":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"u":{"docs":{},"e":{"docs":{},"e":{"docs":{},"r":{"docs":{},"r":{"docs":{},"o":{"docs":{},"r":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}},"i":{"docs":{},"n":{"docs":{},"d":{"docs":{},"e":{"docs":{},"x":{"docs":{},"e":{"docs":{},"r":{"docs":{},"r":{"docs":{},"o":{"docs":{},"r":{"docs":{},",":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}}},"o":{"docs":{},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"f":{"docs":{},"l":{"docs":{},"o":{"docs":{},"w":{"docs":{},"e":{"docs":{},"r":{"docs":{},"r":{"docs":{},"o":{"docs":{},"r":{"docs":{},",":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},"(":{"docs":{},"p":{"docs":{},"y":{"docs":{},"e":{"docs":{},"x":{"docs":{},"c":{"docs":{},"_":{"docs":{},"i":{"docs":{},"n":{"docs":{},"d":{"docs":{},"e":{"docs":{},"x":{"docs":{},"e":{"docs":{},"r":{"docs":{},"r":{"docs":{},"o":{"docs":{},"r":{"docs":{},",":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"b":{"docs":{},"a":{"docs":{},"d":{"docs":{},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"n":{"docs":{},"a":{"docs":{},"l":{"docs":{},"c":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"(":{"docs":{},")":{"docs":{},";":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.006858710562414266},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}},"n":{"docs":{},"o":{"docs":{},"m":{"docs":{},"e":{"docs":{},"m":{"docs":{},"o":{"docs":{},"r":{"docs":{},"y":{"docs":{},"(":{"docs":{},")":{"docs":{},";":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.00411522633744856},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}},"x":{"docs":{},"c":{"docs":{},"_":{"docs":{},"i":{"docs":{},"n":{"docs":{},"d":{"docs":{},"e":{"docs":{},"x":{"docs":{},"e":{"docs":{},"r":{"docs":{},"r":{"docs":{},"o":{"docs":{},"r":{"docs":{},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}},"d":{"docs":{},"i":{"docs":{},"c":{"docs":{},"t":{"docs":{},"_":{"docs":{},"d":{"docs":{},"e":{"docs":{},"l":{"docs":{},"i":{"docs":{},"t":{"docs":{},"e":{"docs":{},"m":{"docs":{},"(":{"docs":{},"(":{"docs":{},"p":{"docs":{},"y":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}},",":{"docs":{},"设":{"docs":{},"置":{"docs":{},"一":{"docs":{},"个":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}},"m":{"docs":{},"i":{"docs":{},"n":{"docs":{},"s":{"docs":{},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"i":{"docs":{},"t":{"docs":{},"e":{"docs":{},"m":{"docs":{},"(":{"docs":{},"(":{"docs":{},"p":{"docs":{},"y":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}},"m":{"docs":{},"a":{"docs":{},"p":{"docs":{},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"p":{"docs":{},"y":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"r":{"docs":{},"i":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"r":{"docs":{},"i":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.002270663033605813}}},"y":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}},"s":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0018165304268846503}},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},",":{"docs":{},"最":{"docs":{},"后":{"docs":{},"就":{"docs":{},"生":{"docs":{},"成":{"docs":{},"一":{"docs":{},"个":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.002270663033605813}},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}},"a":{"docs":{},"r":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.017045454545454544}}}}},"t":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}},"t":{"docs":{},"h":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"n":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}},"c":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}},"b":{"docs":{},"u":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.011363636363636364}},"\\":{"docs":{},"p":{"docs":{},"c":{"docs":{},"b":{"docs":{},"i":{"docs":{},"u":{"docs":{},"l":{"docs":{},"d":{"docs":{},".":{"docs":{},"s":{"docs":{},"l":{"docs":{},"n":{"docs":{"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863}}}}}}}}}}}}}}}}}}}},"r":{"docs":{},"o":{"docs":{},"g":{"docs":{},"r":{"docs":{},"a":{"docs":{},"m":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.011363636363636364}}}}}},"p":{"docs":{},"a":{"docs":{},"g":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}},"o":{"docs":{},"r":{"docs":{},"t":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}},"c":{"docs":{},"e":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}},"e":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"f":{"docs":{},"i":{"docs":{},"x":{"docs":{},"=":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}}},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}}}}}}},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"v":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}},"n":{"docs":{},"c":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}},"t":{"docs":{},".":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"v":{"docs":{},"i":{"docs":{},"o":{"docs":{},"u":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.02127659574468085}},"(":{"1":{"docs":{},")":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425}}}},"docs":{},"n":{"docs":{},"u":{"docs":{},"m":{"docs":{},")":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}},"l":{"docs":{},"s":{"docs":{},"t":{"docs":{},"[":{"3":{"docs":{},"]":{"docs":{},")":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}},"docs":{}}}}}},"f":{"docs":{},"(":{"docs":{},"\"":{"docs":{},"\\":{"docs":{},"n":{"docs":{},"\"":{"docs":{},")":{"docs":{},";":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425}}}}}}},"o":{"docs":{},"b":{"docs":{},"_":{"docs":{},"s":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}},"%":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},"f":{"docs":{},"o":{"docs":{},"u":{"docs":{},"n":{"docs":{},"d":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}}}}}}},"i":{"docs":{},"n":{"docs":{},"d":{"docs":{},"i":{"docs":{},"c":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"s":{"docs":{},"i":{"docs":{},"z":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"u":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}},"u":{"docs":{},"n":{"docs":{},"c":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},",":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}},"e":{"docs":{},"r":{"docs":{},"f":{"docs":{},"o":{"docs":{},"r":{"docs":{},"m":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}},"t":{"docs":{},"u":{"docs":{},"r":{"docs":{},"b":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0013623978201634877},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0026109660574412533}},"_":{"docs":{},"s":{"docs":{},"h":{"docs":{},"i":{"docs":{},"f":{"docs":{},"t":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}}}}}}},")":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"设":{"docs":{},"置":{"docs":{},"为":{"docs":{},"当":{"docs":{},"前":{"docs":{},"h":{"docs":{},"a":{"docs":{},"s":{"docs":{},"h":{"docs":{},"值":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}},"e":{"docs":{},"k":{"docs":{},"(":{"2":{"docs":{},"*":{"docs":{},"i":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"docs":{},"i":{"docs":{},")":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}},"n":{"docs":{},"d":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},":":{"docs":{},"索":{"docs":{},"引":{"docs":{},">":{"docs":{},"=":{"0":{"docs":{},",":{"docs":{},"键":{"docs":{},"!":{"docs":{},"=":{"docs":{},"空":{"docs":{},",":{"docs":{},"值":{"docs":{},"=":{"docs":{},"空":{"docs":{},"(":{"docs":{},"仅":{"docs":{},"拆":{"docs":{},"分":{"docs":{},")":{"docs":{},",":{"docs":{},"尚":{"docs":{},"未":{"docs":{},"插":{"docs":{},"入":{"docs":{},"到":{"docs":{},"拆":{"docs":{},"分":{"docs":{},"表":{"docs":{},"中":{"docs":{},"。":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}}}}}}}}},"docs":{}}}}}},"。":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}},"o":{"docs":{},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}},"e":{"docs":{},"r":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}},"o":{"docs":{},"r":{"docs":{},"l":{"docs":{},"i":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}},"s":{"docs":{},"s":{"docs":{},"i":{"docs":{},"b":{"docs":{},"l":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}},"p":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}},"_":{"docs":{},"t":{"docs":{},"o":{"docs":{},"p":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0032637075718015664}}}}}},"(":{"docs":{},")":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}},"w":{"docs":{},"e":{"docs":{},"r":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}},"u":{"docs":{},"r":{"docs":{},"p":{"docs":{},"o":{"docs":{},"s":{"docs":{},"e":{"docs":{},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"g":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}},"s":{"docs":{},"h":{"docs":{},"(":{"docs":{},"m":{"docs":{},"a":{"docs":{},"p":{"docs":{},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},")":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}},"r":{"docs":{},"e":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"v":{"docs":{},"e":{"docs":{},"d":{"docs":{},",":{"docs":{},"p":{"docs":{},"o":{"docs":{},"w":{"docs":{"./":{"ref":"./","tf":0.006134969325153374},"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182},"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863},"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629},"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425},"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133},"objects/simple-interpreter/":{"ref":"objects/simple-interpreter/","tf":0.07142857142857142}}}}}}}}}}},"i":{"docs":{},"z":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0032637075718015664}},"e":{"docs":{},".":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"t":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{},":":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}}}}}},"a":{"docs":{},"d":{"docs":{},"m":{"docs":{},"e":{"docs":{},".":{"docs":{},"r":{"docs":{},"s":{"docs":{},"t":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}}}},"l":{"docs":{},"i":{"docs":{},"n":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.013888888888888888}}}}}},"l":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{},"(":{"docs":{},")":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}},".":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}},"s":{"docs":{},"o":{"docs":{},"n":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"l":{"docs":{},"e":{"docs":{},"a":{"docs":{},"s":{"docs":{"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863}}}}}},"d":{"docs":{},"h":{"docs":{},"a":{"docs":{},"t":{"docs":{},"/":{"docs":{},"c":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"o":{"docs":{},"s":{"docs":{},"/":{"docs":{},"f":{"docs":{},"e":{"docs":{},"d":{"docs":{},"o":{"docs":{},"r":{"docs":{},"a":{"docs":{},",":{"docs":{},"执":{"docs":{},"行":{"docs":{},":":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.009259259259259259}}}}}}}}}}}}}}}}}}}}}}}},"t":{"docs":{},"u":{"docs":{},"r":{"docs":{},"n":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.02127659574468085},"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/long-object/":{"ref":"objects/long-object/","tf":0.009306260575296108},"objects/list-object/":{"ref":"objects/list-object/","tf":0.03017832647462277},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.010899182561307902},"objects/set-object/":{"ref":"objects/set-object/","tf":0.012402088772845953}},"_":{"docs":{},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"u":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"e":{"docs":{},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}},"p":{"docs":{},"r":{"docs":{},"f":{"docs":{},"u":{"docs":{},"n":{"docs":{},"c":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.002886002886002886}}}}}},"e":{"docs":{},"s":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},".":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}},"e":{"docs":{},"a":{"docs":{},"t":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}},"m":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}},"o":{"docs":{},"v":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}},"v":{"docs":{},"e":{"docs":{},"a":{"docs":{},"l":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}},"u":{"docs":{},"s":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}},"f":{"docs":{},"e":{"docs":{},"r":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}},"c":{"docs":{},"o":{"docs":{},"u":{"docs":{},"n":{"docs":{},"t":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}},"b":{"docs":{},"u":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}},"g":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}},"i":{"docs":{},"g":{"docs":{},"h":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.006134969325153374},"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182},"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863},"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629},"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425},"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133},"objects/simple-interpreter/":{"ref":"objects/simple-interpreter/","tf":0.07142857142857142}}}}},"c":{"docs":{},"h":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}},"o":{"docs":{},"a":{"docs":{},"d":{"docs":{},"m":{"docs":{},"a":{"docs":{},"p":{"docs":{"./":{"ref":"./","tf":0.006134969325153374}}}}}}},"o":{"docs":{},"m":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}},"u":{"docs":{},"n":{"docs":{"./":{"ref":"./","tf":0.012269938650306749}},"t":{"docs":{},"i":{"docs":{},"m":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}},"a":{"docs":{},"n":{"docs":{},"g":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},"e":{"docs":{},"\"":{"docs":{},")":{"docs":{},";":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}}}}}}}},"i":{"docs":{},"s":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}}}}},"v":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}},"s":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"e":{"docs":{},"r":{"docs":{},"v":{"docs":{"./":{"ref":"./","tf":0.006134969325153374}}}},"t":{"docs":{"./":{"ref":"./","tf":0.006134969325153374},"objects/set-object/":{"ref":"objects/set-object/","tf":3.3450826805918186}},"u":{"docs":{},"p":{"docs":{},".":{"docs":{},"p":{"docs":{},"i":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}}},"a":{"docs":{},"t":{"docs":{},"t":{"docs":{},"r":{"docs":{},"f":{"docs":{},"u":{"docs":{},"n":{"docs":{},"c":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}},"o":{"docs":{},"f":{"docs":{},"u":{"docs":{},"n":{"docs":{},"c":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}},",":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"_":{"docs":{},"a":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},".":{"docs":{},"a":{"docs":{},"d":{"docs":{},"d":{"docs":{},"(":{"3":{"docs":{},")":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"本":{"docs":{},"质":{"docs":{},"都":{"docs":{},"调":{"docs":{},"用":{"docs":{},"了":{"docs":{},"更":{"docs":{},"底":{"docs":{},"层":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}},"4":{"docs":{},")":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}},"docs":{}}}}},"r":{"docs":{},"e":{"docs":{},"m":{"docs":{},"o":{"docs":{},"v":{"docs":{},"e":{"docs":{},"(":{"1":{"docs":{},")":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}},"docs":{}}}}}}}},"u":{"docs":{},"n":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"(":{"docs":{},"{":{"1":{"docs":{},",":{"5":{"docs":{},"}":{"docs":{},")":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}},"docs":{}}},"docs":{}}}}}}},"p":{"docs":{},"d":{"docs":{},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"(":{"docs":{},"{":{"3":{"docs":{},",":{"docs":{},"}":{"docs":{},")":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}},"docs":{}}}}}}}}}},"d":{"docs":{},"d":{"docs":{},"_":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"r":{"docs":{},"i":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"y":{"docs":{},"(":{"docs":{},"p":{"docs":{},"y":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}},"s":{"docs":{},"o":{"docs":{},",":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}},"(":{"docs":{},"(":{"docs":{},"p":{"docs":{},"y":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}},"p":{"docs":{},"y":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}}},"d":{"docs":{},"i":{"docs":{},"s":{"docs":{},"c":{"docs":{},"a":{"docs":{},"r":{"docs":{},"d":{"docs":{},"_":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"r":{"docs":{},"i":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"y":{"docs":{},"(":{"docs":{},"p":{"docs":{},"y":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}},"s":{"docs":{},"o":{"docs":{},",":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"(":{"docs":{},"p":{"docs":{},"y":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}},"s":{"docs":{},"o":{"docs":{},",":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}},"i":{"docs":{},"n":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"t":{"docs":{},"_":{"docs":{},"c":{"docs":{},"l":{"docs":{},"e":{"docs":{},"a":{"docs":{},"n":{"docs":{},"(":{"docs":{},"n":{"docs":{},"e":{"docs":{},"w":{"docs":{},"t":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{},"e":{"docs":{},",":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}}}}}}}}},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"r":{"docs":{},"i":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}}}}},"l":{"docs":{},"o":{"docs":{},"o":{"docs":{},"k":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"(":{"docs":{},"s":{"docs":{},"o":{"docs":{},",":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}},"该":{"docs":{},"方":{"docs":{},"法":{"docs":{},"与":{"docs":{},"插":{"docs":{},"入":{"docs":{},"的":{"docs":{},"逻":{"docs":{},"辑":{"docs":{},"类":{"docs":{},"似":{"docs":{},"大":{"docs":{},"家":{"docs":{},"可":{"docs":{},"自":{"docs":{},"行":{"docs":{},"查":{"docs":{},"看":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}}}}}}}}},"r":{"docs":{},"e":{"docs":{},"m":{"docs":{},"o":{"docs":{},"v":{"docs":{},"e":{"docs":{},"(":{"docs":{},")":{"docs":{},"函":{"docs":{},"数":{"docs":{},"上":{"docs":{},",":{"docs":{},"如":{"docs":{},"下":{"docs":{},"示":{"docs":{},"例":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}},"p":{"docs":{},"y":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}},"t":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{},"e":{"docs":{},"_":{"docs":{},"r":{"docs":{},"e":{"docs":{},"s":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},"(":{"docs":{},"p":{"docs":{},"y":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}}}}}}},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},".":{"docs":{},"p":{"docs":{},"i":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"r":{"docs":{},"i":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.007180156657963447}}},"y":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}},"。":{"docs":{},"作":{"docs":{},"为":{"docs":{},"一":{"docs":{},"个":{"docs":{},"无":{"docs":{},"序":{"docs":{},"的":{"docs":{},"集":{"docs":{},"合":{"docs":{},",":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}},",":{"docs":{},"扩":{"docs":{},"充":{"docs":{},"的":{"docs":{},"原":{"docs":{},"则":{"docs":{},"就":{"docs":{},"是":{"docs":{},"如":{"docs":{},"果":{"docs":{},"当":{"docs":{},"前":{"docs":{},"的":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}},"l":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}},"f":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0054869684499314125}}}},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"n":{"docs":{},"c":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"d":{"docs":{},"(":{"docs":{},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}},"e":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},"a":{"docs":{},"r":{"docs":{},"c":{"docs":{},"h":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"e":{"docs":{},"s":{"docs":{},".":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}},"c":{"docs":{},"a":{"docs":{},"n":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}}},"h":{"docs":{},"e":{"docs":{},"m":{"docs":{},"e":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}},"h":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}},"a":{"docs":{},"r":{"docs":{},"e":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.009259259259259259},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}},"d":{"docs":{},".":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}},"o":{"docs":{},"w":{"docs":{},"_":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{},"_":{"docs":{},"c":{"docs":{},"o":{"docs":{},"u":{"docs":{},"n":{"docs":{},"t":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}}}}}},"r":{"docs":{},"i":{"docs":{},"n":{"docs":{},"k":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},",":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}},"t":{"docs":{},"u":{"docs":{},"d":{"docs":{},"i":{"docs":{},"o":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.011363636363636364},"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863}}}}}},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"c":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425},"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/long-object/":{"ref":"objects/long-object/","tf":0.010998307952622674},"objects/list-object/":{"ref":"objects/list-object/","tf":0.009602194787379973},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.002270663033605813},"objects/set-object/":{"ref":"objects/set-object/","tf":0.005221932114882507}}}},"e":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"n":{"docs":{},"d":{"docs":{},"a":{"docs":{},"r":{"docs":{},"d":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.004329004329004329}}}}}}},"r":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},")":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}}}}}},"c":{"docs":{},"k":{"docs":{},"a":{"docs":{},"d":{"docs":{},"j":{"docs":{},"(":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}},"d":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},",":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425}}}}}}},"r":{"docs":{},"u":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.012987012987012988},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0018165304268846503},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}}},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}}}},"c":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}},"l":{"docs":{},"e":{"docs":{},"n":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"o":{"docs":{},"r":{"docs":{},"e":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0013623978201634877},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"_":{"docs":{},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}},"s":{"docs":{},"u":{"docs":{},"b":{"docs":{},"s":{"docs":{},"c":{"docs":{},"r":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0013623978201634877}}}}}}}}}}}}},"d":{"docs":{},"k":{"docs":{"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863}},",":{"docs":{},"如":{"docs":{},"下":{"docs":{},"图":{"docs":{},"所":{"docs":{},"示":{"docs":{},":":{"docs":{"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863}}}}}}}}}}},"q":{"docs":{},"l":{"docs":{},"i":{"docs":{},"t":{"docs":{},"e":{"3":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}},"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.009259259259259259}}}}}}},"u":{"docs":{},"d":{"docs":{},"o":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.009259259259259259}}}},"i":{"docs":{},"t":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}},"b":{"docs":{},"t":{"docs":{},"r":{"docs":{},"a":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}},"l":{"docs":{},"e":{"docs":{},":":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},"c":{"docs":{},"l":{"docs":{},"a":{"docs":{},"s":{"docs":{},"s":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}}}}}}}},"m":{"docs":{},"(":{"docs":{},"f":{"docs":{},"o":{"docs":{},"r":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}},"p":{"docs":{},"p":{"docs":{},"o":{"docs":{},"r":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"r":{"docs":{},"e":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.014532243415077202},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0019582245430809398}},"o":{"docs":{},"f":{"docs":{},"(":{"docs":{},"d":{"docs":{},"i":{"docs":{},"g":{"docs":{},"i":{"docs":{},"t":{"docs":{},")":{"docs":{},",":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.002886002886002886},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}},"p":{"docs":{},"y":{"docs":{},"h":{"docs":{},"e":{"docs":{},"a":{"docs":{},"p":{"docs":{},"t":{"docs":{},"y":{"docs":{},"p":{"docs":{},"e":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},")":{"docs":{},",":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}},"m":{"docs":{},"e":{"docs":{},"m":{"docs":{},"b":{"docs":{},"e":{"docs":{},"r":{"docs":{},"d":{"docs":{},"e":{"docs":{},"f":{"docs":{},")":{"docs":{},",":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.00411522633744856}}}}}}}},"d":{"docs":{},"i":{"docs":{},"c":{"docs":{},"t":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"r":{"docs":{},"y":{"docs":{},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}}}}}}}}}}}}}}}}},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"r":{"docs":{},"y":{"docs":{},")":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}},"m":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"_":{"docs":{},"c":{"docs":{},"o":{"docs":{},"p":{"docs":{},"y":{"docs":{},")":{"docs":{},")":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}}},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},"_":{"docs":{},"a":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0025380710659898475}},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}},"b":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0025380710659898475}}},"t":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0013623978201634877},"objects/set-object/":{"ref":"objects/set-object/","tf":0.006527415143603133}},".":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}},"c":{"docs":{},"o":{"docs":{},"u":{"docs":{},"n":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}},")":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},",":{"docs":{},"检":{"docs":{},"查":{"docs":{},"是":{"docs":{},"否":{"docs":{},"超":{"docs":{},"过":{"docs":{},"设":{"docs":{},"置":{"docs":{},"的":{"docs":{},"大":{"docs":{},"小":{"docs":{},",":{"docs":{},"检":{"docs":{},"查":{"docs":{},"是":{"docs":{},"否":{"docs":{},"有":{"docs":{},"缓":{"docs":{},"存":{"docs":{},"的":{"docs":{},"字":{"docs":{},"典":{"docs":{},"数":{"docs":{},"据":{"docs":{},"可":{"docs":{},"用":{"docs":{},",":{"docs":{},"如":{"docs":{},"果":{"docs":{},"没":{"docs":{},"有":{"docs":{},"则":{"docs":{},"申":{"docs":{},"请":{"docs":{},"内":{"docs":{},"存":{"docs":{},"重":{"docs":{},"新":{"docs":{},"生":{"docs":{},"成":{"docs":{},"一":{"docs":{},"个":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"g":{"docs":{},"n":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.004230118443316413}},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}},"n":{"docs":{},"g":{"docs":{},"l":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}},"m":{"docs":{},"i":{"docs":{},"l":{"docs":{},"a":{"docs":{},"r":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}},"m":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"_":{"docs":{},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},"s":{"docs":{},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}},"[":{"docs":{},"n":{"docs":{},"s":{"docs":{},"m":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"n":{"docs":{},"e":{"docs":{},"g":{"docs":{},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}}}},"c":{"docs":{},"o":{"docs":{},"p":{"docs":{},"y":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"[":{"docs":{},"p":{"docs":{},"y":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"_":{"docs":{},"m":{"docs":{},"i":{"docs":{},"n":{"docs":{},"s":{"docs":{},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},"]":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}}}}},"e":{"docs":{},"r":{"docs":{},".":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}},"s":{"docs":{},"t":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}},"t":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"e":{"docs":{},"[":{"docs":{},"p":{"docs":{},"y":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"_":{"docs":{},"m":{"docs":{},"i":{"docs":{},"n":{"docs":{},"s":{"docs":{},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},"]":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}}}}}}}}},"a":{"docs":{},"v":{"docs":{},"e":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}},"p":{"docs":{},"a":{"docs":{},"c":{"docs":{},"e":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}},"e":{"docs":{},"c":{"docs":{},"i":{"docs":{},"a":{"docs":{},"l":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}}}}}},"e":{"docs":{},"d":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}},"l":{"docs":{},"i":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0036330608537693005}},"t":{"docs":{},"e":{"docs":{},"d":{"docs":{},":":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}},"i":{"docs":{},"l":{"docs":{},"l":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}},"y":{"docs":{},"s":{"docs":{},"t":{"docs":{},"e":{"docs":{},"m":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}},"w":{"docs":{},"i":{"docs":{},"t":{"docs":{},"c":{"docs":{},"h":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}}}}}}},".":{"docs":{},"a":{"docs":{},"d":{"docs":{},"d":{"docs":{},"(":{"1":{"docs":{},")":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}},"2":{"docs":{},")":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}},"7":{"docs":{},")":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}},"docs":{}}}}}},"l":{"docs":{},"o":{"docs":{},"t":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"s":{"docs":{},",":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}},"u":{"docs":{},"n":{"docs":{},"i":{"docs":{},"x":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425}},"/":{"docs":{},"l":{"docs":{},"i":{"docs":{},"n":{"docs":{},"u":{"docs":{},"x":{"docs":{"./":{"ref":"./","tf":0.006134969325153374},"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":3.342592592592592}}}}}}}}},"c":{"docs":{},"o":{"docs":{},"d":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0018165304268846503}},"e":{"docs":{},"_":{"docs":{},"h":{"docs":{},"a":{"docs":{},"s":{"docs":{},"h":{"docs":{},",":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}},"函":{"docs":{},"数":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}},"e":{"docs":{},"q":{"docs":{},"(":{"docs":{},"e":{"docs":{},"p":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"o":{"docs":{},"n":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}},"s":{"docs":{},"i":{"docs":{},"g":{"docs":{},"n":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0025380710659898475},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}},"u":{"docs":{},"s":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},"e":{"docs":{},"d":{"docs":{},":":{"docs":{},"没":{"docs":{},"有":{"docs":{},"插":{"docs":{},"入":{"docs":{},"任":{"docs":{},"何":{"docs":{},"一":{"docs":{},"个":{"docs":{},"获":{"docs":{},"取":{"docs":{},"的":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}},"u":{"docs":{},"i":{"docs":{},"d":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.009259259259259259}}}}},"s":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0026109660574412533}},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}},"e":{"docs":{},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}}}},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}}},"_":{"docs":{},"f":{"docs":{},"r":{"docs":{},"a":{"docs":{},"c":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"(":{"docs":{},"m":{"docs":{},"a":{"docs":{},"x":{"docs":{},"_":{"docs":{},"p":{"docs":{},"r":{"docs":{},"e":{"docs":{},"s":{"docs":{},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},")":{"docs":{},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}},"s":{"docs":{},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}}},"e":{"docs":{},"d":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},">":{"5":{"0":{"0":{"0":{"0":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"docs":{}},"docs":{}},"docs":{}},"docs":{}},"docs":{}}}}},"i":{"docs":{},"n":{"docs":{},"t":{"6":{"4":{"docs":{},"_":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}},"docs":{}},"docs":{}}}},"p":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"d":{"docs":{},"a":{"docs":{},"t":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}},"w":{"docs":{},"i":{"docs":{},"n":{"docs":{},"d":{"docs":{},"o":{"docs":{},"w":{"docs":{"./":{"ref":"./","tf":0.006134969325153374},"preface/windows-build/":{"ref":"preface/windows-build/","tf":3.3881278538812785}}}}}},"k":{"docs":{},"i":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}},"m":{"docs":{},"p":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}},"h":{"docs":{},"e":{"docs":{},"r":{"docs":{},"e":{"docs":{},",":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.00411522633744856}}},";":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}},"o":{"docs":{},"n":{"docs":{},"'":{"docs":{},"t":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"e":{"docs":{},"'":{"docs":{},"r":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}},"a":{"docs":{},"k":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}},"©":{"docs":{"./":{"ref":"./","tf":0.006134969325153374},"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182},"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863},"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629},"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425},"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133},"objects/simple-interpreter/":{"ref":"objects/simple-interpreter/","tf":0.07142857142857142}}},"介":{"docs":{},"绍":{"docs":{"./":{"ref":"./","tf":0.006134969325153374}}}},"使":{"docs":{},"用":{"docs":{"./":{"ref":"./","tf":0.024539877300613498}},"个":{"docs":{},"数":{"docs":{},"加":{"docs":{},"1":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"加":{"docs":{},"1":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"的":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},"s":{"docs":{},"个":{"docs":{},"数":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}},"缓":{"docs":{},"冲":{"docs":{},"池":{"docs":{},"对":{"docs":{},"象":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"总":{"docs":{},"数":{"docs":{},"加":{"docs":{},"1":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}}}},"数":{"docs":{},"加":{"docs":{},"1":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}},"量":{"docs":{},"减":{"docs":{},"1":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}},"修":{"docs":{},"改":{"docs":{"./":{"ref":"./","tf":0.006134969325153374},"preface/modify-code/":{"ref":"preface/modify-code/","tf":3.3439716312056733}}}},"内":{"docs":{},"存":{"docs":{},"管":{"docs":{},"理":{"docs":{},"机":{"docs":{},"制":{"docs":{"./":{"ref":"./","tf":0.006134969325153374}}}}}},"申":{"docs":{},"请":{"docs":{},"失":{"docs":{},"败":{"docs":{},"则":{"docs":{},"返":{"docs":{},"回":{"docs":{},"为":{"docs":{},"空":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}},"建":{"docs":{},"对":{"docs":{},"象":{"docs":{"./":{"ref":"./","tf":0.006134969325153374}}}}},"部":{"docs":{},"会":{"docs":{},"用":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}},"各":{"docs":{},"个":{"docs":{},"函":{"docs":{},"数":{"docs":{},"之":{"docs":{},"间":{"docs":{},"传":{"docs":{},"递":{"docs":{},"的":{"docs":{},"都":{"docs":{},"是":{"docs":{},"一":{"docs":{},"种":{"docs":{},"范":{"docs":{},"型":{"docs":{},"指":{"docs":{},"针":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}},"调":{"docs":{},"试":{"docs":{},"用":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}},"前":{"docs":{},"置":{"docs":{},"条":{"docs":{},"件":{"docs":{"./":{"ref":"./","tf":0.006134969325153374}}}}},"言":{"docs":{"./":{"ref":"./","tf":10.006134969325153}}},"通":{"docs":{},"常":{"docs":{},"需":{"docs":{},"要":{"docs":{},"在":{"docs":{},"系":{"docs":{},"统":{"docs":{},"上":{"docs":{},"安":{"docs":{},"装":{"docs":{},"以":{"docs":{},"下":{"docs":{},"库":{"docs":{},":":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}}}}}}}}}}}}},"面":{"docs":{},"我":{"docs":{},"们":{"docs":{},"提":{"docs":{},"到":{"docs":{},"了":{"docs":{},"p":{"docs":{},"y":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}},"提":{"docs":{},"到":{"docs":{},",":{"docs":{},"在":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}},"即":{"docs":{},"可":{"docs":{},"查":{"docs":{},"看":{"docs":{},"本":{"docs":{},"书":{"docs":{},"内":{"docs":{},"容":{"docs":{},"。":{"docs":{"./":{"ref":"./","tf":0.006134969325153374}}}}}}}}},"获":{"docs":{},"取":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.011363636363636364}}}}}},"命":{"docs":{},"令":{"docs":{},"去":{"docs":{},"构":{"docs":{},"建":{"docs":{"./":{"ref":"./","tf":0.006134969325153374}}}}},"的":{"docs":{},"方":{"docs":{},"式":{"docs":{},"构":{"docs":{},"建":{"docs":{},":":{"docs":{"./":{"ref":"./","tf":0.012269938650306749}}}}}}}},",":{"docs":{},"或":{"docs":{},"想":{"docs":{},"直":{"docs":{},"接":{"docs":{},"使":{"docs":{},"用":{"docs":{"./":{"ref":"./","tf":0.006134969325153374}}}}}}}},"执":{"docs":{},"行":{"docs":{},"如":{"docs":{},"下":{"docs":{},"命":{"docs":{},"令":{"docs":{},"进":{"docs":{},"行":{"docs":{},"初":{"docs":{},"始":{"docs":{},"化":{"docs":{},":":{"docs":{"./":{"ref":"./","tf":0.006134969325153374}}}}}}}}}}}}}},"简":{"docs":{},"单":{"docs":{},"执":{"docs":{},"行":{"docs":{},"如":{"docs":{},"下":{"docs":{},"命":{"docs":{},"令":{"docs":{},"进":{"docs":{},"行":{"docs":{},"初":{"docs":{},"始":{"docs":{},"化":{"docs":{},":":{"docs":{"./":{"ref":"./","tf":0.006134969325153374}}}}}}}}}}}}}}}}},"为":{"docs":{},":":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.009259259259259259}}}}}},"在":{"docs":{"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0273972602739726},"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629},"objects/object/":{"ref":"objects/object/","tf":0.007215007215007215},"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"线":{"docs":{},"版":{"docs":{},",":{"docs":{},"或":{"docs":{},"者":{"docs":{},"根":{"docs":{},"据":{"docs":{},"以":{"docs":{},"下":{"docs":{},"步":{"docs":{},"骤":{"docs":{},"访":{"docs":{},"问":{"docs":{},"本":{"docs":{},"地":{"docs":{},"版":{"docs":{},"。":{"docs":{"./":{"ref":"./","tf":0.006134969325153374}}}}}}}}}}}}}}}}}}},"运":{"docs":{},"行":{"docs":{},"时":{"docs":{},"需":{"docs":{},"要":{"docs":{},"的":{"docs":{},"所":{"docs":{},"有":{"docs":{},"的":{"docs":{},"内":{"docs":{},"部":{"docs":{},"使":{"docs":{},"用":{"docs":{},"对":{"docs":{},"象":{"docs":{},"的":{"docs":{},"实":{"docs":{},"现":{"docs":{},"。":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}}}}}}}}}}}}}}}}},"下":{"docs":{},"载":{"docs":{},"完":{"docs":{},"成":{"docs":{},"后":{"docs":{},",":{"docs":{},"需":{"docs":{},"要":{"docs":{},"注":{"docs":{},"意":{"docs":{},"安":{"docs":{},"装":{"docs":{},"环":{"docs":{},"节":{"docs":{},"的":{"docs":{},"选":{"docs":{},"项":{"docs":{},"。":{"docs":{},"由":{"docs":{},"于":{"docs":{"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863}}}}}}}}}}}}}}}}}}}}}},"左":{"docs":{},"侧":{"docs":{},"的":{"docs":{},"解":{"docs":{},"决":{"docs":{},"方":{"docs":{},"案":{"docs":{},"目":{"docs":{},"录":{"docs":{},"中":{"docs":{},"选":{"docs":{},"择":{"docs":{"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863}}}}},"的":{"docs":{},"顶":{"docs":{},"端":{"docs":{},",":{"docs":{},"右":{"docs":{},"键":{"docs":{},"选":{"docs":{},"择":{"docs":{},"“":{"docs":{},"属":{"docs":{},"性":{"docs":{},"”":{"docs":{},",":{"docs":{},"以":{"docs":{},"打":{"docs":{},"开":{"docs":{},"属":{"docs":{},"性":{"docs":{},"界":{"docs":{},"面":{"docs":{},"(":{"docs":{},"如":{"docs":{},"下":{"docs":{},"图":{"docs":{},"所":{"docs":{},"示":{"docs":{},")":{"docs":{},"。":{"docs":{"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"指":{"docs":{},"定":{"docs":{},"目":{"docs":{},"录":{"docs":{},"中":{"docs":{},":":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}}}}},"接":{"docs":{},"下":{"docs":{},"来":{"docs":{},"研":{"docs":{},"究":{"docs":{},"源":{"docs":{},"码":{"docs":{},"的":{"docs":{},"过":{"docs":{},"程":{"docs":{},"中":{"docs":{},",":{"docs":{},"我":{"docs":{},"们":{"docs":{},"可":{"docs":{},"能":{"docs":{},"会":{"docs":{},"对":{"docs":{},"某":{"docs":{},"些":{"docs":{},"语":{"docs":{},"句":{"docs":{},"的":{"docs":{},"逻":{"docs":{},"辑":{"docs":{},"感":{"docs":{},"到":{"docs":{},"好":{"docs":{},"奇":{"docs":{},",":{"docs":{},"需":{"docs":{},"要":{"docs":{},"输":{"docs":{},"出":{"docs":{},"中":{"docs":{},"间":{"docs":{},"结":{"docs":{},"果":{"docs":{},"。":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"源":{"docs":{},"代":{"docs":{},"码":{"docs":{},"中":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425}}}}}},"p":{"docs":{},"y":{"docs":{},"t":{"docs":{},"y":{"docs":{},"p":{"docs":{},"e":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},"的":{"docs":{},"代":{"docs":{},"码":{"docs":{},"中":{"docs":{},",":{"docs":{},"我":{"docs":{},"们":{"docs":{},"还":{"docs":{},"可":{"docs":{},"以":{"docs":{},"看":{"docs":{},"到":{"docs":{},"非":{"docs":{},"常":{"docs":{},"重":{"docs":{},"要":{"docs":{},"的":{"docs":{},"三":{"docs":{},"组":{"docs":{},"操":{"docs":{},"作":{"docs":{},"族":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"h":{"docs":{},"o":{"docs":{},"n":{"docs":{},"中":{"docs":{},"的":{"docs":{},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"可":{"docs":{},"以":{"docs":{},"存":{"docs":{},"放":{"docs":{},"任":{"docs":{},"何":{"docs":{},"类":{"docs":{},"型":{"docs":{},"的":{"docs":{},"数":{"docs":{},"据":{"docs":{},",":{"docs":{},"查":{"docs":{},"看":{"docs":{},"p":{"docs":{},"y":{"docs":{},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},"可":{"docs":{},"以":{"docs":{},"发":{"docs":{},"现":{"docs":{},",":{"docs":{},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"实":{"docs":{},"际":{"docs":{},"存":{"docs":{},"放":{"docs":{},"的":{"docs":{},"是":{"docs":{},"p":{"docs":{},"y":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},"*":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"以":{"docs":{},"下":{"docs":{},"代":{"docs":{},"码":{"docs":{},"中":{"docs":{},"可":{"docs":{},"以":{"docs":{},"看":{"docs":{},"出":{"docs":{},"p":{"docs":{},"y":{"docs":{},"l":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"_":{"docs":{},"t":{"docs":{},"y":{"docs":{},"p":{"docs":{},"e":{"docs":{},"中":{"docs":{},"的":{"docs":{},"t":{"docs":{},"p":{"docs":{},"_":{"docs":{},"a":{"docs":{},"s":{"docs":{},"_":{"docs":{},"n":{"docs":{},"u":{"docs":{},"m":{"docs":{},"b":{"docs":{},"e":{"docs":{},"r":{"docs":{},"项":{"docs":{},"指":{"docs":{},"向":{"docs":{},"的":{"docs":{},"是":{"docs":{},"l":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"_":{"docs":{},"a":{"docs":{},"s":{"docs":{},"_":{"docs":{},"n":{"docs":{},"u":{"docs":{},"m":{"docs":{},"b":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"开":{"docs":{},"始":{"docs":{},"我":{"docs":{},"们":{"docs":{},"的":{"docs":{},"学":{"docs":{},"习":{"docs":{},"之":{"docs":{},"旅":{"docs":{},"之":{"docs":{},"前":{"docs":{},",":{"docs":{},"我":{"docs":{},"们":{"docs":{},"要":{"docs":{},"先":{"docs":{},"认":{"docs":{},"识":{"docs":{},"一":{"docs":{},"个":{"docs":{},"结":{"docs":{},"构":{"docs":{},"体":{"docs":{},"p":{"docs":{},"y":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},",":{"docs":{},"可":{"docs":{},"以":{"docs":{},"说":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"类":{"docs":{},"型":{"docs":{},"机":{"docs":{},"制":{"docs":{},"中":{"docs":{},"至":{"docs":{},"关":{"docs":{},"重":{"docs":{},"要":{"docs":{},",":{"docs":{},"所":{"docs":{},"有":{"docs":{},"用":{"docs":{},"户":{"docs":{},"自":{"docs":{},"定":{"docs":{},"义":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}},"初":{"docs":{},"始":{"docs":{},"化":{"docs":{},"的":{"docs":{},"时":{"docs":{},"候":{"docs":{},"都":{"docs":{},"会":{"docs":{},"处":{"docs":{},"于":{"docs":{},"这":{"docs":{},"种":{"docs":{},"状":{"docs":{},"态":{"docs":{},",":{"docs":{},"并":{"docs":{},"且":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}},"本":{"docs":{},"例":{"docs":{},"的":{"docs":{},"初":{"docs":{},"始":{"docs":{},"化":{"docs":{},"过":{"docs":{},"程":{"docs":{},"中":{"docs":{},",":{"docs":{},"由":{"docs":{},"于":{"docs":{},"传":{"docs":{},"入":{"docs":{},"了":{"docs":{},"初":{"docs":{},"始":{"docs":{},"值":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}}},"多":{"docs":{},"线":{"docs":{},"程":{"docs":{},"机":{"docs":{},"制":{"docs":{"./":{"ref":"./","tf":0.006134969325153374}}}}}}},"大":{"docs":{},"体":{"docs":{},"按":{"docs":{},"照":{"docs":{},"《":{"docs":{},"p":{"docs":{},"y":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"n":{"docs":{"./":{"ref":"./","tf":0.006134969325153374}}}}}}}}}}}},"于":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}}},"致":{"docs":{},"的":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}},"字":{"docs":{},"符":{"docs":{},"串":{"docs":{"./":{"ref":"./","tf":0.006134969325153374},"objects/simple-interpreter/":{"ref":"objects/simple-interpreter/","tf":0.07142857142857142}}}},"典":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},"对":{"docs":{},"象":{"docs":{},"操":{"docs":{},"作":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}},"是":{"docs":{},"通":{"docs":{},"过":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"最":{"docs":{},"大":{"docs":{},"的":{"docs":{},"容":{"docs":{},"量":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"概":{"docs":{},"述":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"的":{"docs":{},"两":{"docs":{},"种":{"docs":{},"类":{"docs":{},"型":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"初":{"docs":{},"始":{"docs":{},"化":{"docs":{},"流":{"docs":{},"程":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"插":{"docs":{},"入":{"docs":{},"与":{"docs":{},"查":{"docs":{},"找":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"操":{"docs":{},"作":{"docs":{},"测":{"docs":{},"试":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"最":{"docs":{},"佳":{"docs":{},"大":{"docs":{},"小":{"docs":{},"容":{"docs":{},"量":{"docs":{},"限":{"docs":{},"定":{"docs":{},"在":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}},"示":{"docs":{},"例":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},",":{"docs":{},"一":{"docs":{},"个":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"该":{"docs":{},"字":{"docs":{},"典":{"docs":{},"的":{"docs":{},"行":{"docs":{},"为":{"docs":{},"方":{"docs":{},"式":{"docs":{},"与":{"docs":{},"最":{"docs":{},"初":{"docs":{},"的":{"docs":{},"字":{"docs":{},"典":{"docs":{},"的":{"docs":{},"行":{"docs":{},"为":{"docs":{},"方":{"docs":{},"式":{"docs":{},"大":{"docs":{},"致":{"docs":{},"相":{"docs":{},"同":{"docs":{},"。":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"安":{"docs":{},"装":{"docs":{},"项":{"docs":{},"目":{"docs":{},"依":{"docs":{},"赖":{"docs":{},":":{"docs":{"./":{"ref":"./","tf":0.006134969325153374}}}}}}},"在":{"docs":{},"特":{"docs":{},"定":{"docs":{},"目":{"docs":{},"录":{"docs":{},",":{"docs":{},"则":{"docs":{},"需":{"docs":{},"要":{"docs":{},"在":{"docs":{},"一":{"docs":{},"开":{"docs":{},"始":{"docs":{},"修":{"docs":{},"改":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}}}}}}}}}}}}}}},"全":{"docs":{},"套":{"docs":{},"接":{"docs":{},"字":{"docs":{},"层":{"docs":{},"密":{"docs":{},"码":{"docs":{},"库":{"docs":{},",":{"docs":{},"l":{"docs":{},"i":{"docs":{},"n":{"docs":{},"u":{"docs":{},"x":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}}}}}}}}}}}}}},"实":{"docs":{},"现":{"docs":{},"简":{"docs":{},"版":{"docs":{"./":{"ref":"./","tf":0.006134969325153374},"objects/simple-interpreter/":{"ref":"objects/simple-interpreter/","tf":5}}}},"了":{"docs":{},"多":{"docs":{},"态":{"docs":{},"机":{"docs":{},"制":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}},"际":{"docs":{},"绑":{"docs":{},"定":{"docs":{},"的":{"docs":{},"是":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}},"调":{"docs":{},"用":{"docs":{},"的":{"docs":{},"就":{"docs":{},"是":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}},"对":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182},"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425}},"象":{"docs":{"./":{"ref":"./","tf":0.024539877300613498},"objects/list-object/":{"ref":"objects/list-object/","tf":3.334705075445816},"objects/dict-object/":{"ref":"objects/dict-object/","tf":3.333333333333333},"objects/set-object/":{"ref":"objects/set-object/","tf":3.333333333333333},"objects/simple-interpreter/":{"ref":"objects/simple-interpreter/","tf":0.07142857142857142}},"初":{"docs":{},"探":{"docs":{"./":{"ref":"./","tf":0.006134969325153374},"objects/object/":{"ref":"objects/object/","tf":5.001443001443001}}}},":":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.007215007215007215}}},"上":{"docs":{},",":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}},"对":{"docs":{},"应":{"docs":{},"的":{"docs":{},"类":{"docs":{},"型":{"docs":{},"对":{"docs":{},"象":{"docs":{},"中":{"docs":{},"定":{"docs":{},"义":{"docs":{},"的":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.002886002886002886}}}}}}}}}}}}},"机":{"docs":{},"制":{"docs":{},"的":{"docs":{},"基":{"docs":{},"石":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}},"的":{"docs":{},"分":{"docs":{},"类":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}},"创":{"docs":{},"建":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}},"多":{"docs":{},"态":{"docs":{},"性":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}},"大":{"docs":{},"致":{"docs":{},"的":{"docs":{},"一":{"docs":{},"个":{"docs":{},"分":{"docs":{},"类":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}},"类":{"docs":{},"型":{"docs":{},"是":{"docs":{},"由":{"docs":{},"该":{"docs":{},"对":{"docs":{},"象":{"docs":{},"指":{"docs":{},"向":{"docs":{},"的":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}},"行":{"docs":{},"为":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}},"高":{"docs":{},"位":{"docs":{},"数":{"docs":{},"字":{"docs":{},",":{"docs":{},"最":{"docs":{},"后":{"docs":{},"使":{"docs":{},"用":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}},"变":{"docs":{},"化":{"docs":{},"过":{"docs":{},"程":{"docs":{},"中":{"docs":{},",":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"r":{"docs":{},"i":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}},"类":{"docs":{},"型":{"docs":{},"指":{"docs":{},"针":{"docs":{},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{},"u":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}},"都":{"docs":{},"是":{"docs":{},"通":{"docs":{},"过":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}},"除":{"docs":{},"了":{"docs":{},"前":{"docs":{},"面":{"docs":{},"提":{"docs":{},"到":{"docs":{},"的":{"docs":{},"那":{"docs":{},"种":{"docs":{},"分":{"docs":{},"类":{"docs":{},"方":{"docs":{},"法":{"docs":{},"外":{"docs":{},",":{"docs":{},"还":{"docs":{},"可":{"docs":{},"以":{"docs":{},"分":{"docs":{},"为":{"docs":{},"定":{"docs":{},"长":{"docs":{},"对":{"docs":{},"象":{"docs":{},"和":{"docs":{},"变":{"docs":{},"长":{"docs":{},"对":{"docs":{},"象":{"docs":{},"这":{"docs":{},"两":{"docs":{},"种":{"docs":{},"形":{"docs":{},"式":{"docs":{},"。":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"赋":{"docs":{},"值":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}},",":{"docs":{},"最":{"docs":{},"后":{"docs":{},"返":{"docs":{},"回":{"docs":{},"。":{"docs":{},"至":{"docs":{},"此":{"docs":{},",":{"docs":{},"d":{"docs":{},"i":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}},"于":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.023148148148148147}},"其":{"docs":{},"他":{"docs":{},"对":{"docs":{},"象":{"docs":{},",":{"docs":{},"可":{"docs":{},"以":{"docs":{},"通":{"docs":{},"过":{"docs":{},"与":{"docs":{},"其":{"docs":{},"关":{"docs":{},"联":{"docs":{},"的":{"docs":{},"类":{"docs":{},"型":{"docs":{},"对":{"docs":{},"象":{"docs":{},"确":{"docs":{},"定":{"docs":{},"其":{"docs":{},"类":{"docs":{},"型":{"docs":{},",":{"docs":{},"那":{"docs":{},"么":{"docs":{},"通":{"docs":{},"过":{"docs":{},"什":{"docs":{},"么":{"docs":{},"来":{"docs":{},"确":{"docs":{},"定":{"docs":{},"一":{"docs":{},"个":{"docs":{},"对":{"docs":{},"象":{"docs":{},"是":{"docs":{},"类":{"docs":{},"型":{"docs":{},"对":{"docs":{},"象":{"docs":{},"呢":{"docs":{},"?":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"初":{"docs":{},"学":{"docs":{},"者":{"docs":{},"来":{"docs":{},"说":{"docs":{},"这":{"docs":{},"么":{"docs":{},"多":{"docs":{},"类":{"docs":{},"型":{"docs":{},"的":{"docs":{},"对":{"docs":{},"象":{"docs":{},"怎":{"docs":{},"么":{"docs":{},"学":{"docs":{},"?":{"docs":{},"别":{"docs":{},"着":{"docs":{},"急":{"docs":{},",":{"docs":{},"我":{"docs":{},"们":{"docs":{},"后":{"docs":{},"续":{"docs":{},"章":{"docs":{},"节":{"docs":{},"会":{"docs":{},"解":{"docs":{},"答":{"docs":{},"。":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"应":{"docs":{},"的":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}},"方":{"docs":{},"法":{"docs":{},",":{"docs":{},"在":{"docs":{},"初":{"docs":{},"始":{"docs":{},"化":{"docs":{},"之":{"docs":{},"后":{"docs":{},"对":{"docs":{},"应":{"docs":{},"的":{"docs":{},"是":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}},"希":{"docs":{},"望":{"docs":{},"各":{"docs":{},"位":{"docs":{"./":{"ref":"./","tf":0.006134969325153374}}}}}},"序":{"docs":{},"章":{"docs":{"./":{"ref":"./","tf":0.006134969325153374}}},"列":{"docs":{},"对":{"docs":{},"象":{"docs":{},"操":{"docs":{},"作":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}},"您":{"docs":{},"可":{"docs":{},"以":{"docs":{},"直":{"docs":{},"接":{"docs":{},"访":{"docs":{},"问":{"docs":{"./":{"ref":"./","tf":0.006134969325153374}}}}}}}},"的":{"docs":{},"系":{"docs":{},"统":{"docs":{},"上":{"docs":{},"需":{"docs":{},"要":{"docs":{},"安":{"docs":{},"装":{"docs":{},"好":{"docs":{"./":{"ref":"./","tf":0.006134969325153374}}}}}}}}}}}},"或":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182},"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863}},"者":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}},"使":{"docs":{},"用":{"docs":{"./":{"ref":"./","tf":0.006134969325153374}}}}},"称":{"docs":{},"为":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.002886002886002886}}}},"操":{"docs":{},"作":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}},"其":{"docs":{},"它":{"docs":{},"类":{"docs":{},"序":{"docs":{},"列":{"docs":{},"的":{"docs":{},"操":{"docs":{},"作":{"docs":{},"。":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}},"执":{"docs":{},"行":{"docs":{},"如":{"docs":{},"下":{"docs":{},"命":{"docs":{},"令":{"docs":{},"运":{"docs":{},"行":{"docs":{},"服":{"docs":{},"务":{"docs":{},"端":{"docs":{},":":{"docs":{"./":{"ref":"./","tf":0.012269938650306749}}}}}}}}}}}},"下":{"docs":{},"一":{"docs":{},"条":{"docs":{},"指":{"docs":{},"令":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}},"整":{"docs":{},"数":{"docs":{},"对":{"docs":{},"象":{"docs":{"./":{"ref":"./","tf":0.006134969325153374},"objects/long-object/":{"ref":"objects/long-object/","tf":5.000846023688664}},",":{"docs":{},"那":{"docs":{},"么":{"docs":{},"它":{"docs":{},"的":{"docs":{},"类":{"docs":{},"型":{"docs":{},"对":{"docs":{},"象":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}},"的":{"docs":{},"数":{"docs":{},"值":{"docs":{},"操":{"docs":{},"作":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}},"的":{"docs":{},"存":{"docs":{},"储":{"docs":{},"结":{"docs":{},"构":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}},"相":{"docs":{},"乘":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}},"加":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}},"本":{"docs":{},"项":{"docs":{},"目":{"docs":{},"致":{"docs":{},"力":{"docs":{},"于":{"docs":{},"对":{"docs":{"./":{"ref":"./","tf":0.006134969325153374}}}}}}}},"次":{"docs":{},"示":{"docs":{},"例":{"docs":{},"脚":{"docs":{},"本":{"docs":{},"如":{"docs":{},"下":{"docs":{},":":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}},"模":{"docs":{},"块":{"docs":{},"加":{"docs":{},"载":{"docs":{},"机":{"docs":{},"制":{"docs":{"./":{"ref":"./","tf":0.006134969325153374}}}}}}}},"源":{"docs":{},"代":{"docs":{},"码":{"docs":{},"的":{"docs":{},"组":{"docs":{},"织":{"docs":{"./":{"ref":"./","tf":0.006134969325153374},"preface/code-organization/":{"ref":"preface/code-organization/","tf":5.005681818181818}}}}},"下":{"docs":{},"载":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}},"可":{"docs":{},"以":{"docs":{},"在":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}},"就":{"docs":{},"从":{"docs":{},"这":{"docs":{},"里":{"docs":{},"开":{"docs":{},"始":{"docs":{},"(":{"docs":{},"本":{"docs":{},"书":{"docs":{},"将":{"docs":{},"采":{"docs":{},"用":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}}}}}}}}}},"进":{"docs":{},"行":{"docs":{},"词":{"docs":{},"法":{"docs":{},"分":{"docs":{},"析":{"docs":{},"和":{"docs":{},"语":{"docs":{},"法":{"docs":{},"分":{"docs":{},"析":{"docs":{},"的":{"docs":{},"部":{"docs":{},"分":{"docs":{},"。":{"docs":{},"除":{"docs":{},"此":{"docs":{},"以":{"docs":{},"外":{"docs":{},",":{"docs":{},"此":{"docs":{},"目":{"docs":{},"录":{"docs":{},"还":{"docs":{},"包":{"docs":{},"含":{"docs":{},"了":{"docs":{},"一":{"docs":{},"些":{"docs":{},"有":{"docs":{},"用":{"docs":{},"的":{"docs":{},"工":{"docs":{},"具":{"docs":{},",":{"docs":{},"这":{"docs":{},"些":{"docs":{},"工":{"docs":{},"具":{"docs":{},"能":{"docs":{},"够":{"docs":{},"根":{"docs":{},"据":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"码":{"docs":{"./":{"ref":"./","tf":0.006134969325153374},"preface/modify-code/":{"ref":"preface/modify-code/","tf":3.3439716312056733}},"剖":{"docs":{},"析":{"docs":{},"》":{"docs":{},"中":{"docs":{},"的":{"docs":{},"目":{"docs":{},"录":{"docs":{},"结":{"docs":{},"构":{"docs":{},"进":{"docs":{},"行":{"docs":{},"编":{"docs":{},"写":{"docs":{},"。":{"docs":{},"依":{"docs":{},"次":{"docs":{},"介":{"docs":{},"绍":{"docs":{"./":{"ref":"./","tf":0.006134969325153374}}}}}}}}}}}}}}}}},",":{"docs":{},"编":{"docs":{},"写":{"docs":{"./":{"ref":"./","tf":0.006134969325153374}}}}}}}},"基":{"docs":{},"本":{"docs":{},"信":{"docs":{},"息":{"docs":{},"、":{"docs":{},"内":{"docs":{},"建":{"docs":{},"对":{"docs":{},"象":{"docs":{},"和":{"docs":{},"虚":{"docs":{},"拟":{"docs":{},"机":{"docs":{},"。":{"docs":{"./":{"ref":"./","tf":0.006134969325153374}}}}}}}}}}}}}}}},"包":{"docs":{},"。":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}},"根":{"docs":{},"目":{"docs":{},"录":{"docs":{},",":{"docs":{},"打":{"docs":{},"开":{"docs":{"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863}}}},"执":{"docs":{},"行":{"docs":{},"以":{"docs":{},"下":{"docs":{},"命":{"docs":{},"令":{"docs":{},":":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}}}}}}}}}},"的":{"docs":{},"头":{"docs":{},"文":{"docs":{},"件":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}}}},"文":{"docs":{},"件":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},":":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},"s":{"docs":{},"/":{"docs":{},"l":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},".":{"docs":{},"c":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425},"objects/object/":{"ref":"objects/object/","tf":0.002886002886002886},"objects/long-object/":{"ref":"objects/long-object/","tf":0.01015228426395939}}},"h":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},".":{"docs":{},"c":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.009602194787379973}}}}}}}}}}}}}},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},".":{"docs":{},"c":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425}}}}}}}}}},"t":{"docs":{},"y":{"docs":{},"p":{"docs":{},"e":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},".":{"docs":{},"c":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}},"u":{"docs":{},"n":{"docs":{},"i":{"docs":{},"c":{"docs":{},"o":{"docs":{},"d":{"docs":{},"e":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},".":{"docs":{},"c":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}},"c":{"docs":{},"l":{"docs":{},"i":{"docs":{},"n":{"docs":{},"i":{"docs":{},"c":{"docs":{},"/":{"docs":{},"l":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},".":{"docs":{},"c":{"docs":{},".":{"docs":{},"h":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}}}}}}}},"a":{"docs":{},"b":{"docs":{},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{},"a":{"docs":{},"c":{"docs":{},"t":{"docs":{},".":{"docs":{},"c":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}},"d":{"docs":{},"i":{"docs":{},"c":{"docs":{},"t":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},".":{"docs":{},"c":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.003178928247048138}}}}}}}}}}}}}},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},".":{"docs":{},"c":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.00587467362924282}}}}}}}}}}}}}}}}}}}}},"i":{"docs":{},"n":{"docs":{},"c":{"docs":{},"l":{"docs":{},"u":{"docs":{},"d":{"docs":{},"e":{"docs":{},"/":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},".":{"docs":{},"h":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.010101010101010102}}}}}}}}}},"l":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},"r":{"docs":{},"e":{"docs":{},"p":{"docs":{},"r":{"docs":{},".":{"docs":{},"h":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},".":{"docs":{},"h":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},".":{"docs":{},"c":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}},"h":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}}}},"d":{"docs":{},"i":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},".":{"docs":{},"h":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},".":{"docs":{},"h":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}}}}}}}}}}}}}}}}}}},"p":{"docs":{},"y":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"n":{"docs":{},"/":{"docs":{},"c":{"docs":{},"e":{"docs":{},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},".":{"docs":{},"c":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}},"爱":{"docs":{},"好":{"docs":{},"者":{"docs":{},"能":{"docs":{},"参":{"docs":{},"与":{"docs":{},"其":{"docs":{},"中":{"docs":{},",":{"docs":{},"一":{"docs":{},"起":{"docs":{},"探":{"docs":{},"索":{"docs":{"./":{"ref":"./","tf":0.006134969325153374}}}}}}}}}}}}}}},"环":{"docs":{},"境":{"docs":{},"下":{"docs":{},"编":{"docs":{},"译":{"docs":{"./":{"ref":"./","tf":0.012269938650306749},"preface/windows-build/":{"ref":"preface/windows-build/","tf":3.3607305936073057},"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":3.342592592592592}}}}},"准":{"docs":{},"备":{"docs":{"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0273972602739726},"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}},"(":{"docs":{},"准":{"docs":{},"备":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}}}}}},"的":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0018165304268846503},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0026109660574412533}},"源":{"docs":{},"码":{"docs":{},"分":{"docs":{},"析":{"docs":{},",":{"docs":{},"深":{"docs":{},"度":{"docs":{},"参":{"docs":{},"考":{"docs":{},"陈":{"docs":{},"儒":{"docs":{},"大":{"docs":{},"大":{"docs":{},"的":{"docs":{},"《":{"docs":{},"p":{"docs":{},"y":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"n":{"docs":{"./":{"ref":"./","tf":0.006134969325153374}}}}}}}}}}}}}}}}}}}}}}},"版":{"docs":{},"本":{"docs":{},"。":{"docs":{"./":{"ref":"./","tf":0.006134969325153374}}},"为":{"docs":{"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863}}}}},"内":{"docs":{},"建":{"docs":{},"对":{"docs":{},"象":{"docs":{},",":{"docs":{},"包":{"docs":{},"括":{"docs":{},"整":{"docs":{},"数":{"docs":{},"、":{"docs":{},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"、":{"docs":{},"d":{"docs":{},"i":{"docs":{},"c":{"docs":{},"t":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}}}}}}}}}}}}}}}},"容":{"docs":{},"见":{"docs":{},"官":{"docs":{},"方":{"docs":{},"指":{"docs":{},"南":{"docs":{"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863}}}}}}}}},"工":{"docs":{},"程":{"docs":{},"文":{"docs":{},"件":{"docs":{},",":{"docs":{},"研":{"docs":{},"究":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}}}}},"核":{"docs":{},"心":{"docs":{},"部":{"docs":{},"分":{"docs":{},",":{"docs":{},"可":{"docs":{},"以":{"docs":{},"选":{"docs":{},"择":{"docs":{},"不":{"docs":{},"编":{"docs":{},"译":{"docs":{},"标":{"docs":{},"准":{"docs":{},"库":{"docs":{},"和":{"docs":{},"外":{"docs":{},"部":{"docs":{},"依":{"docs":{},"赖":{"docs":{},",":{"docs":{},"在":{"docs":{},"“":{"docs":{},"配":{"docs":{},"置":{"docs":{},"属":{"docs":{},"性":{"docs":{},"”":{"docs":{"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"操":{"docs":{},"作":{"docs":{},"系":{"docs":{},"统":{"docs":{},"中":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}},"基":{"docs":{},"本":{"docs":{},"如":{"docs":{},"上":{"docs":{},"所":{"docs":{},"述":{"docs":{},"。":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}},"世":{"docs":{},"界":{"docs":{},"一":{"docs":{},"切":{"docs":{},"皆":{"docs":{},"对":{"docs":{},"象":{"docs":{},",":{"docs":{},"不":{"docs":{},"论":{"docs":{},"是":{"docs":{},"整":{"docs":{},"数":{"docs":{},",":{"docs":{},"还":{"docs":{},"是":{"docs":{},"字":{"docs":{},"符":{"docs":{},"串":{"docs":{},",":{"docs":{},"甚":{"docs":{},"至":{"docs":{},"连":{"docs":{},"类":{"docs":{},"型":{"docs":{},"、":{"docs":{},"函":{"docs":{},"数":{"docs":{},"等":{"docs":{},"都":{"docs":{},"是":{"docs":{},"一":{"docs":{},"种":{"docs":{},"对":{"docs":{},"象":{"docs":{},"。":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"代":{"docs":{},"码":{"docs":{},"如":{"docs":{},"下":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}},"关":{"docs":{},"联":{"docs":{},"对":{"docs":{},"象":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}},"定":{"docs":{},"义":{"docs":{},"中":{"docs":{},"包":{"docs":{},"含":{"docs":{},"许":{"docs":{},"多":{"docs":{},"信":{"docs":{},"息":{"docs":{},",":{"docs":{},"主":{"docs":{},"要":{"docs":{},"分":{"docs":{},"类":{"docs":{},"以":{"docs":{},"下":{"docs":{},"几":{"docs":{},"类":{"docs":{},":":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}},"如":{"docs":{},"下":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"对":{"docs":{},"象":{"docs":{},"机":{"docs":{},"制":{"docs":{},"就":{"docs":{},"是":{"docs":{},"基":{"docs":{},"于":{"docs":{},"p":{"docs":{},"y":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},"拓":{"docs":{},"展":{"docs":{},"开":{"docs":{},"来":{"docs":{},"的":{"docs":{},",":{"docs":{},"所":{"docs":{},"以":{"docs":{},"我":{"docs":{},"们":{"docs":{},"先":{"docs":{},"看":{"docs":{},"看":{"docs":{},"p":{"docs":{},"y":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"执":{"docs":{},"行":{"docs":{},"效":{"docs":{},"率":{"docs":{},"。":{"docs":{},"因":{"docs":{},"此":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}},"流":{"docs":{},"程":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},"可":{"docs":{},"知":{"docs":{},",":{"docs":{},"字":{"docs":{},"典":{"docs":{},"的":{"docs":{},"初":{"docs":{},"始":{"docs":{},"化":{"docs":{},"过":{"docs":{},"程":{"docs":{},"就":{"docs":{},"是":{"docs":{},"初":{"docs":{},"始":{"docs":{},"化":{"docs":{},"相":{"docs":{},"关":{"docs":{},"数":{"docs":{},"据":{"docs":{},"结":{"docs":{},"构":{"docs":{},"。":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"整":{"docs":{},"数":{"docs":{},"对":{"docs":{},"象":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}},"示":{"docs":{},"例":{"docs":{},"图":{"docs":{},"如":{"docs":{},"下":{"docs":{},",":{"docs":{},"注":{"docs":{},":":{"docs":{},"p":{"docs":{},"y":{"docs":{},"l":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"_":{"docs":{},"s":{"docs":{},"h":{"docs":{},"i":{"docs":{},"f":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}}}}}}},"第":{"docs":{},"三":{"docs":{},"行":{"docs":{},"有":{"docs":{},"这":{"docs":{},"么":{"docs":{},"一":{"docs":{},"句":{"docs":{},"话":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}},"算":{"docs":{},"法":{"docs":{},"主":{"docs":{},"要":{"docs":{},"是":{"docs":{},"用":{"docs":{},"于":{"docs":{},"两":{"docs":{},"个":{"docs":{},"大":{"docs":{},"数":{"docs":{},"的":{"docs":{},"乘":{"docs":{},"法":{"docs":{},",":{"docs":{},"极":{"docs":{},"大":{"docs":{},"提":{"docs":{},"高":{"docs":{},"了":{"docs":{},"运":{"docs":{},"算":{"docs":{},"效":{"docs":{},"率":{"docs":{},",":{"docs":{},"相":{"docs":{},"较":{"docs":{},"于":{"docs":{},"普":{"docs":{},"通":{"docs":{},"乘":{"docs":{},"法":{"docs":{},"降":{"docs":{},"低":{"docs":{},"了":{"docs":{},"复":{"docs":{},"杂":{"docs":{},"度":{"docs":{},",":{"docs":{},"并":{"docs":{},"在":{"docs":{},"其":{"docs":{},"中":{"docs":{},"运":{"docs":{},"用":{"docs":{},"了":{"docs":{},"递":{"docs":{},"归":{"docs":{},"的":{"docs":{},"思":{"docs":{},"想":{"docs":{},"。":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"身":{"docs":{},"影":{"docs":{},",":{"docs":{},"以":{"docs":{},"下":{"docs":{},"只":{"docs":{},"列":{"docs":{},"出":{"docs":{},"了":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}},"_":{"docs":{},"_":{"docs":{},"d":{"docs":{},"i":{"docs":{},"c":{"docs":{},"t":{"docs":{},"_":{"docs":{},"_":{"docs":{},"属":{"docs":{},"性":{"docs":{},"时":{"docs":{},",":{"docs":{},"该":{"docs":{},"字":{"docs":{},"典":{"docs":{},"才":{"docs":{},"会":{"docs":{},"创":{"docs":{},"建":{"docs":{},"为":{"docs":{},"一":{"docs":{},"个":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}}}}},"位":{"docs":{},"置":{"docs":{},"不":{"docs":{},"能":{"docs":{},"被":{"docs":{},"重":{"docs":{},"新":{"docs":{},"使":{"docs":{},"用":{"docs":{},",":{"docs":{},"一":{"docs":{},"旦":{"docs":{},"发":{"docs":{},"生":{"docs":{},"碰":{"docs":{},"撞":{"docs":{},",":{"docs":{},"探":{"docs":{},"针":{"docs":{},"序":{"docs":{},"列":{"docs":{},"就":{"docs":{},"无":{"docs":{},"法":{"docs":{},"知":{"docs":{},"道":{"docs":{},"这":{"docs":{},"对":{"docs":{},"键":{"docs":{},"值":{"docs":{},"对":{"docs":{},"曾":{"docs":{},"是":{"docs":{},"活":{"docs":{},"跃":{"docs":{},"的":{"docs":{},"键":{"docs":{},"值":{"docs":{},"对":{"docs":{},"。":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"创":{"docs":{},"建":{"docs":{},"工":{"docs":{},"作":{"docs":{},"已":{"docs":{},"经":{"docs":{},"完":{"docs":{},"成":{"docs":{},"。":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}},"与":{"docs":{},"初":{"docs":{},"始":{"docs":{},"化":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}},"反":{"docs":{},"汇":{"docs":{},"编":{"docs":{},"工":{"docs":{},"具":{"docs":{},"获":{"docs":{},"取":{"docs":{},"字":{"docs":{},"节":{"docs":{},"码":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}},"大":{"docs":{},"小":{"docs":{},"必":{"docs":{},"须":{"docs":{},"是":{"docs":{},"2":{"docs":{},"的":{"docs":{},"倍":{"docs":{},"数":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}},"字":{"docs":{},"典":{"docs":{},"中":{"docs":{},",":{"docs":{},"一":{"docs":{},"个":{"docs":{},"键":{"docs":{},"值":{"docs":{},"对":{"docs":{},"的":{"docs":{},"对":{"docs":{},"应":{"docs":{},"保":{"docs":{},"存":{"docs":{},"就":{"docs":{},"是":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}},"就":{"docs":{},"是":{"docs":{},"实":{"docs":{},"现":{"docs":{},"了":{"docs":{},"一":{"docs":{},"个":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}},"类":{"docs":{},"型":{"docs":{},"中":{"docs":{},"包":{"docs":{},"含":{"docs":{},"了":{"docs":{},"两":{"docs":{},"种":{"docs":{},",":{"docs":{},"分":{"docs":{},"离":{"docs":{},"字":{"docs":{},"典":{"docs":{},"(":{"docs":{},"s":{"docs":{},"p":{"docs":{},"l":{"docs":{},"i":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}}}},"实":{"docs":{},"例":{"docs":{},",":{"docs":{},"字":{"docs":{},"典":{"docs":{},"会":{"docs":{},"立":{"docs":{},"马":{"docs":{},"再":{"docs":{},"变":{"docs":{},"为":{"docs":{},"一":{"docs":{},"个":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}},"描":{"docs":{},"述":{"docs":{},"p":{"docs":{},"e":{"docs":{},"p":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"方":{"docs":{},"法":{"docs":{},"集":{"docs":{},"。":{"docs":{},"此":{"docs":{},"时":{"docs":{},"就":{"docs":{},"调":{"docs":{},"用":{"docs":{},"了":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}},",":{"docs":{},"并":{"docs":{},"调":{"docs":{},"用":{"docs":{},"了":{"docs":{},"该":{"docs":{},"方":{"docs":{},"法":{"docs":{},"集":{"docs":{},"的":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}},"状":{"docs":{},"态":{"docs":{},"会":{"docs":{},"在":{"docs":{},"不":{"docs":{},"同":{"docs":{},"的":{"docs":{},"状":{"docs":{},"态":{"docs":{},"间":{"docs":{},"转":{"docs":{},"换":{"docs":{},"。":{"docs":{},"基":{"docs":{},"本":{"docs":{},"上":{"docs":{},"在":{"docs":{},"如":{"docs":{},"下":{"docs":{},"四":{"docs":{},"种":{"docs":{},"状":{"docs":{},"态":{"docs":{},"中":{"docs":{},"转":{"docs":{},"换":{"docs":{},":":{"docs":{},"u":{"docs":{},"n":{"docs":{},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"d":{"docs":{},"、":{"docs":{},"a":{"docs":{},"c":{"docs":{},"t":{"docs":{},"i":{"docs":{},"v":{"docs":{},"e":{"docs":{},"、":{"docs":{},"d":{"docs":{},"u":{"docs":{},"m":{"docs":{},"m":{"docs":{},"i":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"索":{"docs":{},"引":{"docs":{},"值":{"docs":{},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"虚":{"docs":{},"拟":{"docs":{},"机":{"docs":{},"执":{"docs":{},"行":{"docs":{},"函":{"docs":{},"数":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},"如":{"docs":{},"下":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}},"键":{"docs":{},"值":{"docs":{},"对":{"docs":{},",":{"docs":{},"但":{"docs":{},"是":{"docs":{},"这":{"docs":{},"个":{"docs":{},"键":{"docs":{},"值":{"docs":{},"对":{"docs":{},"被":{"docs":{},"删":{"docs":{},"除":{"docs":{},"了":{"docs":{},"并":{"docs":{},"且":{"docs":{},"一":{"docs":{},"个":{"docs":{},"活":{"docs":{},"跃":{"docs":{},"的":{"docs":{},"键":{"docs":{},"值":{"docs":{},"对":{"docs":{},"还":{"docs":{},"没":{"docs":{},"有":{"docs":{},"填":{"docs":{},"入":{"docs":{},"该":{"docs":{},"位":{"docs":{},"置":{"docs":{},",":{"docs":{},"d":{"docs":{},"u":{"docs":{},"m":{"docs":{},"m":{"docs":{},"i":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"值":{"docs":{},"插":{"docs":{},"入":{"docs":{},"到":{"docs":{},"新":{"docs":{},"表":{"docs":{},"中":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}},"的":{"docs":{},"存":{"docs":{},"储":{"docs":{},"是":{"docs":{},"通":{"docs":{},"过":{"docs":{},"结":{"docs":{},"构":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}},",":{"docs":{},"然":{"docs":{},"后":{"docs":{},"判":{"docs":{},"断":{"docs":{},"是":{"docs":{},"否":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}},"删":{"docs":{},"除":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"操":{"docs":{},"作":{"docs":{},"主":{"docs":{},"要":{"docs":{},"集":{"docs":{},"中":{"docs":{},"在":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}},"插":{"docs":{},"入":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"过":{"docs":{},"程":{"docs":{},"执":{"docs":{},"行":{"docs":{},"完":{"docs":{},"毕":{"docs":{},"。":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}},"数":{"docs":{},"据":{"docs":{},"结":{"docs":{},"构":{"docs":{},"如":{"docs":{},"下":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}},"量":{"docs":{},",":{"docs":{},"从":{"docs":{},"此":{"docs":{},"处":{"docs":{},"可":{"docs":{},"知":{"docs":{},",":{"docs":{},"f":{"docs":{},"i":{"docs":{},"l":{"docs":{},"l":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}},"检":{"docs":{},"查":{"docs":{},",":{"docs":{},"此":{"docs":{},"时":{"docs":{},"如":{"docs":{},"果":{"docs":{},"可":{"docs":{},"用":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}},"直":{"docs":{},"接":{"docs":{},"访":{"docs":{},"问":{"docs":{"./":{"ref":"./","tf":0.006134969325153374}}}},"讲":{"docs":{},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"u":{"docs":{},"e":{"docs":{},"设":{"docs":{},"置":{"docs":{},"到":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"r":{"docs":{},"y":{"docs":{},"上":{"docs":{},"面":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}},"设":{"docs":{},"置":{"docs":{},"m":{"docs":{},"a":{"docs":{},"_":{"docs":{},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"对":{"docs":{},"应":{"docs":{},"的":{"docs":{},"i":{"docs":{},"x":{"docs":{},"到":{"docs":{},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"中":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}}}}}}},"通":{"docs":{},"过":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"章":{"docs":{},"节":{"docs":{"./":{"ref":"./","tf":0.006134969325153374}}}},"编":{"docs":{},"译":{"docs":{"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0273972602739726},"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}},"结":{"docs":{},"果":{"docs":{"./":{"ref":"./","tf":0.006134969325153374}}},"束":{"docs":{},"后":{"docs":{},",":{"docs":{},"生":{"docs":{},"成":{"docs":{},"的":{"docs":{},"文":{"docs":{},"件":{"docs":{},"存":{"docs":{},"放":{"docs":{},"在":{"docs":{},"p":{"docs":{},"c":{"docs":{},"b":{"docs":{},"u":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{},"\\":{"docs":{},"w":{"docs":{},"i":{"docs":{},"n":{"3":{"2":{"docs":{},"目":{"docs":{},"录":{"docs":{},"下":{"docs":{},"(":{"docs":{},"如":{"docs":{},"下":{"docs":{},"图":{"docs":{},"所":{"docs":{},"示":{"docs":{},")":{"docs":{},",":{"docs":{},"打":{"docs":{},"开":{"docs":{},"p":{"docs":{},"y":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"n":{"docs":{},"_":{"docs":{},"d":{"docs":{},"即":{"docs":{},"可":{"docs":{},"打":{"docs":{},"开":{"docs":{},"新":{"docs":{},"生":{"docs":{},"成":{"docs":{},"的":{"docs":{"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"docs":{}},"docs":{}}}}}}}}}}}}}}}}}}}}}}}},"、":{"docs":{},"安":{"docs":{},"装":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.009259259259259259}}}}},"工":{"docs":{},"具":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}},"安":{"docs":{},"装":{"docs":{},"后":{"docs":{},"进":{"docs":{},"入":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}},"写":{"docs":{},"的":{"docs":{},"小":{"docs":{},"型":{"docs":{},"数":{"docs":{},"据":{"docs":{},"库":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}}}}}}},"若":{"docs":{},"您":{"docs":{},"不":{"docs":{},"能":{"docs":{},"使":{"docs":{},"用":{"docs":{"./":{"ref":"./","tf":0.006134969325153374}}}}}},"可":{"docs":{},"使":{"docs":{},"用":{"docs":{"./":{"ref":"./","tf":0.006134969325153374}}}}}}},"虚":{"docs":{},"拟":{"docs":{},"机":{"docs":{"./":{"ref":"./","tf":0.006134969325153374}},"一":{"docs":{},"般":{"docs":{},"表":{"docs":{},"达":{"docs":{},"式":{"docs":{"./":{"ref":"./","tf":0.006134969325153374}}}}}}},"函":{"docs":{},"数":{"docs":{},"机":{"docs":{},"制":{"docs":{"./":{"ref":"./","tf":0.006134969325153374}}}}}},"控":{"docs":{},"制":{"docs":{},"流":{"docs":{"./":{"ref":"./","tf":0.006134969325153374}}}}},"框":{"docs":{},"架":{"docs":{"./":{"ref":"./","tf":0.006134969325153374}}}},"在":{"docs":{},"运":{"docs":{},"行":{"docs":{},"时":{"docs":{},"内":{"docs":{},"部":{"docs":{},"使":{"docs":{},"用":{"docs":{},"的":{"docs":{},"对":{"docs":{},"象":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}},"访":{"docs":{},"问":{"docs":{"./":{"ref":"./","tf":0.006134969325153374},"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}},"运":{"docs":{},"行":{"docs":{},"环":{"docs":{},"境":{"docs":{},"初":{"docs":{},"始":{"docs":{},"化":{"docs":{"./":{"ref":"./","tf":0.006134969325153374}}}}}}},"的":{"docs":{},"核":{"docs":{},"心":{"docs":{},"所":{"docs":{},"在":{"docs":{},"。":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}}}},"于":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}},"编":{"docs":{},"译":{"docs":{},"后":{"docs":{},"的":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425}}}}}}}},"魔":{"docs":{},"法":{"docs":{},"背":{"docs":{},"后":{"docs":{},"的":{"docs":{},"奥":{"docs":{},"秘":{"docs":{},"!":{"docs":{"./":{"ref":"./","tf":0.006134969325153374}}}}}}}}}},"(":{"docs":{},"会":{"docs":{},"自":{"docs":{},"带":{"docs":{},"n":{"docs":{},"p":{"docs":{},"m":{"docs":{},")":{"docs":{},"。":{"docs":{"./":{"ref":"./","tf":0.006134969325153374}}}}}}}}}}},".":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}},"/":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"f":{"docs":{},"i":{"docs":{},"g":{"docs":{},"u":{"docs":{},"r":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.013888888888888888}}}}}}}}}}},".":{"docs":{},".":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.005772005772005772},"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},".":{"docs":{},".":{"docs":{},".":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.008658008658008658}}}}}}}},"a":{"docs":{},"c":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{},"a":{"docs":{},"l":{"docs":{},".":{"docs":{},"m":{"4":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}},"docs":{}}}}}}}},"c":{"docs":{},"o":{"docs":{},"m":{"docs":{},"m":{"docs":{},"o":{"docs":{},"d":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}},"t":{"docs":{},"i":{"docs":{},"v":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0013623978201634877},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0019582245430809398}},"e":{"docs":{},":":{"docs":{},"当":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"u":{"docs":{},"a":{"docs":{},"l":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}}}}}}},"p":{"docs":{},"t":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.009259259259259259}}},"i":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425},"objects/object/":{"ref":"objects/object/","tf":0.007215007215007215}},"。":{"docs":{},"例":{"docs":{},"如":{"docs":{},"整":{"docs":{},"数":{"docs":{},"对":{"docs":{},"象":{"docs":{},",":{"docs":{},"我":{"docs":{},"们":{"docs":{},"可":{"docs":{},"以":{"docs":{},"利":{"docs":{},"用":{"docs":{},"如":{"docs":{},"下":{"docs":{},"的":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}}},"p":{"1":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}},"(":{"docs":{},"(":{"docs":{},"p":{"docs":{},"y":{"docs":{},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}}}}},"p":{"docs":{},"y":{"docs":{},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}}}}}},"docs":{},"e":{"docs":{},"n":{"docs":{},"d":{"docs":{},"s":{"docs":{},"(":{"docs":{},")":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}},"l":{"docs":{},"w":{"docs":{},"a":{"docs":{},"y":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.02127659574468085},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0054869684499314125}},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"d":{"docs":{},"/":{"2":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}},"docs":{}}}}}}}}}},"o":{"docs":{},"l":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}},"b":{"docs":{},"s":{"docs":{},"(":{"docs":{},"o":{"docs":{},"b":{"docs":{},"_":{"docs":{},"s":{"docs":{},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},")":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}},"_":{"docs":{},"i":{"docs":{},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}},"o":{"docs":{},"l":{"docs":{},"u":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0025380710659898475}}}}}}}},"d":{"docs":{},"d":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"i":{"docs":{},"t":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}},"r":{"docs":{},"g":{"docs":{},"u":{"docs":{},"m":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"\"":{"docs":{},")":{"docs":{},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}},"r":{"docs":{},"a":{"docs":{},"y":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}},"b":{"docs":{},"i":{"docs":{},"t":{"docs":{},"r":{"docs":{},"a":{"docs":{},"r":{"docs":{},"i":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}},"e":{"docs":{},"n":{"docs":{},"'":{"docs":{},"t":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}},"s":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"t":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0018165304268846503}},"(":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},"b":{"docs":{},"o":{"docs":{},"r":{"docs":{},"r":{"docs":{},"o":{"docs":{},"w":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}},"s":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},"e":{"docs":{},"l":{"docs":{},"f":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}},"t":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}}}}}}}},"_":{"docs":{},"p":{"docs":{},"y":{"docs":{},"d":{"docs":{},"i":{"docs":{},"c":{"docs":{},"t":{"docs":{},"_":{"docs":{},"c":{"docs":{},"h":{"docs":{},"e":{"docs":{},"c":{"docs":{},"k":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"e":{"docs":{},"n":{"docs":{},"c":{"docs":{},"y":{"docs":{},"(":{"docs":{},"m":{"docs":{},"p":{"docs":{},")":{"docs":{},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0013623978201634877}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"e":{"docs":{},"p":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"i":{"docs":{},"s":{"docs":{},"_":{"docs":{},"p":{"docs":{},"o":{"docs":{},"w":{"docs":{},"e":{"docs":{},"r":{"docs":{},"_":{"docs":{},"o":{"docs":{},"f":{"docs":{},"_":{"2":{"docs":{},"(":{"docs":{},"s":{"docs":{},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},")":{"docs":{},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}},"docs":{}}}}}}}}}}}},"x":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"m":{"docs":{},"p":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}}},"i":{"docs":{},"n":{"docs":{},"u":{"docs":{},"s":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}},"o":{"docs":{},"l":{"docs":{},"d":{"docs":{},"_":{"docs":{},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"u":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"t":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}},"p":{"docs":{},"y":{"docs":{},"u":{"docs":{},"n":{"docs":{},"i":{"docs":{},"c":{"docs":{},"o":{"docs":{},"d":{"docs":{},"e":{"docs":{},"_":{"docs":{},"c":{"docs":{},"h":{"docs":{},"e":{"docs":{},"c":{"docs":{},"k":{"docs":{},"e":{"docs":{},"x":{"docs":{},"a":{"docs":{},"c":{"docs":{},"t":{"docs":{},"(":{"docs":{},"e":{"docs":{},"p":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}}}}}}}},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"u":{"docs":{},"e":{"docs":{},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}},"n":{"docs":{},"e":{"docs":{},"w":{"docs":{},"t":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}},"i":{"docs":{},"g":{"docs":{},"n":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}},"m":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"\"":{"docs":{},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}},"、":{"docs":{},"b":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}},"m":{"docs":{},"o":{"docs":{},"r":{"docs":{},"t":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}},"n":{"docs":{},"y":{"docs":{},"m":{"docs":{},"o":{"docs":{},"r":{"docs":{},"e":{"docs":{},".":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"t":{"docs":{},"h":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},".":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}},"w":{"docs":{},"a":{"docs":{},"y":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}},"v":{"docs":{},"o":{"docs":{},"i":{"docs":{},"d":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}},"o":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.011363636363636364},"objects/object/":{"ref":"objects/object/","tf":0.004329004329004329},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.002270663033605813},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},")":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}},"s":{"docs":{},"/":{"docs":{},"l":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},".":{"docs":{},"c":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.004329004329004329},"objects/long-object/":{"ref":"objects/long-object/","tf":0.008460236886632826}}}}}}}}}}}}},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},".":{"docs":{},"c":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.00411522633744856}}}}}}}}}}}}}},"t":{"docs":{},"y":{"docs":{},"p":{"docs":{},"e":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},".":{"docs":{},"c":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}},"u":{"docs":{},"n":{"docs":{},"i":{"docs":{},"c":{"docs":{},"o":{"docs":{},"d":{"docs":{},"e":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},".":{"docs":{},"c":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}},"c":{"docs":{},"l":{"docs":{},"i":{"docs":{},"n":{"docs":{},"i":{"docs":{},"c":{"docs":{},"/":{"docs":{},"l":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},".":{"docs":{},"c":{"docs":{},".":{"docs":{},"h":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}}}}}}}},"a":{"docs":{},"b":{"docs":{},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{},"a":{"docs":{},"c":{"docs":{},"t":{"docs":{},".":{"docs":{},"c":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}},"d":{"docs":{},"i":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},".":{"docs":{},"c":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.003178928247048138}}}}}}}}}}}}}}}},"(":{"docs":{},"c":{"docs":{},"_":{"docs":{},"d":{"docs":{},"e":{"docs":{},"f":{"docs":{},"a":{"docs":{},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{},"=":{"docs":{},"\"":{"docs":{},"n":{"docs":{},"u":{"docs":{},"l":{"docs":{},"l":{"docs":{},"\"":{"docs":{},")":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}}}}}}}}}}}}}}}}}}}},"/":{"docs":{},"l":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},".":{"docs":{},"c":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}}}},"_":{"docs":{},"b":{"docs":{},"a":{"docs":{},"s":{"docs":{},"e":{"docs":{},";":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.002886002886002886}}}}}}},"d":{"docs":{},"i":{"docs":{},"g":{"docs":{},"i":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},")":{"docs":{},",":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.002886002886002886},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}},"[":{"0":{"docs":{},"]":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}}}},"1":{"docs":{},"]":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}},"2":{"docs":{},"]":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}},"docs":{},"a":{"docs":{},"b":{"docs":{},"s":{"docs":{},"(":{"docs":{},"o":{"docs":{},"b":{"docs":{},"_":{"docs":{},"s":{"docs":{},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},")":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}},"i":{"docs":{},"]":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.00338409475465313}},")":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}},"n":{"docs":{},"d":{"docs":{},"e":{"docs":{},"x":{"docs":{},"]":{"docs":{},")":{"docs":{},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}},"r":{"docs":{},"e":{"docs":{},"f":{"docs":{},"c":{"docs":{},"n":{"docs":{},"t":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}},";":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.002886002886002886}}}}}}}}},"s":{"docs":{},"i":{"docs":{},"z":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0025380710659898475}},"e":{"docs":{},";":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}},",":{"docs":{},"确":{"docs":{},"保":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}},".":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}},"不":{"docs":{},"会":{"docs":{},"改":{"docs":{},"变":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"d":{"docs":{},"。":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}}}}}}}}}},"t":{"docs":{},"y":{"docs":{},"p":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.002886002886002886}}}}},"i":{"docs":{},"t":{"docs":{},"e":{"docs":{},"m":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.00411522633744856}},"[":{"0":{"docs":{},"]":{"docs":{},",":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}},"docs":{},"i":{"docs":{},"]":{"docs":{},",":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}},";":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}},"a":{"docs":{},"s":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0025380710659898475}},"e":{"docs":{},")":{"docs":{},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}}}},":":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}},"s":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}},"。":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}},"p":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}},"e":{"docs":{},"n":{"docs":{},"s":{"docs":{},"s":{"docs":{},"l":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.018518518518518517}}}}}},"r":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.002886002886002886}}}},";":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}},"a":{"docs":{},"r":{"docs":{},"g":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},")":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}},"f":{"docs":{},"f":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"o":{"docs":{},"f":{"docs":{},"(":{"docs":{},"p":{"docs":{},"y":{"docs":{},"l":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},",":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.002886002886002886},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}}}}}}}},"n":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"r":{"docs":{},"g":{"docs":{},"a":{"docs":{},"n":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"u":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}},"p":{"docs":{},"u":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},"=":{"docs":{},"e":{"4":{"7":{"docs":{},"c":{"docs":{},"f":{"docs":{},"e":{"7":{"7":{"7":{"docs":{},"a":{"docs":{},"b":{"0":{"docs":{},"f":{"2":{"4":{"docs":{},"c":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}},"docs":{}},"docs":{}}},"docs":{}}}},"docs":{}},"docs":{}},"docs":{}}}}},"docs":{}},"docs":{}},"f":{"0":{"8":{"7":{"docs":{},"e":{"1":{"9":{"5":{"1":{"docs":{},"a":{"5":{"docs":{},"e":{"3":{"0":{"docs":{},"d":{"1":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}},"docs":{}}},"docs":{}},"docs":{}}},"docs":{}}},"docs":{}},"docs":{}},"docs":{}},"docs":{}}},"docs":{}},"docs":{}},"docs":{}}}}}}}},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.00411522633744856}},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}},"f":{"docs":{},"l":{"docs":{},"o":{"docs":{},"w":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}},"r":{"docs":{},"i":{"docs":{},"d":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}},",":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"l":{"docs":{},"d":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"_":{"docs":{},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"u":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},"e":{"1":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"docs":{}}}}}},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}},"m":{"docs":{},"a":{"docs":{},"s":{"docs":{},"k":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}},"t":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}},"e":{"docs":{},")":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}},",":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}}}}}}}}},"t":{"docs":{},"a":{"docs":{},"r":{"docs":{},"b":{"docs":{},"a":{"docs":{},"l":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},"(":{"docs":{},"b":{"docs":{},"u":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{},"_":{"docs":{},"m":{"docs":{},"a":{"docs":{},"p":{"docs":{},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},")":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}},"s":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{},"e":{"docs":{},"_":{"docs":{},"s":{"docs":{},"u":{"docs":{},"b":{"docs":{},"s":{"docs":{},"c":{"docs":{},"r":{"docs":{},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}},"b":{"docs":{},"l":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00862851952770209},"objects/set-object/":{"ref":"objects/set-object/","tf":0.008485639686684074}},"e":{"docs":{},".":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"s":{"docs":{},".":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}},"。":{"docs":{},"如":{"docs":{},"果":{"docs":{},"从":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},",":{"docs":{},"如":{"docs":{},"果":{"docs":{},"重":{"docs":{},"置":{"docs":{},"大":{"docs":{},"小":{"docs":{},"作":{"docs":{},"为":{"docs":{},"保":{"docs":{},"存":{"docs":{},"实":{"docs":{},"例":{"docs":{},"属":{"docs":{},"性":{"docs":{},"的":{"docs":{},"结":{"docs":{},"果":{"docs":{},",":{"docs":{},"并":{"docs":{},"且":{"docs":{},"只":{"docs":{},"有":{"docs":{},"一":{"docs":{},"个":{"docs":{},"该":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}}}}}}}},"它":{"docs":{},"们":{"docs":{},"的":{"docs":{},"键":{"docs":{},"表":{"docs":{},"都":{"docs":{},"被":{"docs":{},"缓":{"docs":{},"存":{"docs":{},"在":{"docs":{},"类":{"docs":{},"型":{"docs":{},"属":{"docs":{},"性":{"docs":{},"中":{"docs":{},",":{"docs":{},"并":{"docs":{},"且":{"docs":{},"允":{"docs":{},"许":{"docs":{},"所":{"docs":{},"有":{"docs":{},"该":{"docs":{},"类":{"docs":{},"型":{"docs":{},"的":{"docs":{},"实":{"docs":{},"例":{"docs":{},"都":{"docs":{},"可":{"docs":{},"以":{"docs":{},"共":{"docs":{},"享":{"docs":{},"该":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}},"o":{"docs":{},"o":{"docs":{},"l":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}},"p":{"docs":{},"(":{"docs":{},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"k":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.013888888888888888}}},"e":{"docs":{},"r":{"docs":{},"n":{"docs":{},"a":{"docs":{},"r":{"docs":{},"y":{"docs":{},"f":{"docs":{},"u":{"docs":{},"n":{"docs":{},"c":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}},"r":{"docs":{},"i":{"docs":{},"b":{"docs":{},"l":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}},"m":{"docs":{},"i":{"docs":{},"n":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}},"m":{"docs":{},"p":{"docs":{},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}},"n":{"docs":{},"p":{"docs":{},"o":{"docs":{},"w":{"docs":{},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}},"s":{"docs":{},"t":{"docs":{},"s":{"docs":{},".":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}},"p":{"docs":{},"_":{"docs":{},"a":{"docs":{},"s":{"docs":{},"_":{"docs":{},"m":{"docs":{},"a":{"docs":{},"p":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0013623978201634877}}}}},"n":{"docs":{},"u":{"docs":{},"m":{"docs":{},"b":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}},"s":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}},"b":{"docs":{},"u":{"docs":{},"f":{"docs":{},"f":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}},"l":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}},"b":{"docs":{},"a":{"docs":{},"s":{"docs":{},"i":{"docs":{},"c":{"docs":{},"s":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.005772005772005772},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},",":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}},"e":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}},"c":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},";":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}},"o":{"docs":{},"m":{"docs":{},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}},"l":{"docs":{},"e":{"docs":{},"a":{"docs":{},"r":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}},"d":{"docs":{},"e":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},";":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}},"s":{"docs":{},"c":{"docs":{},"r":{"docs":{},"_":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}},"i":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},"o":{"docs":{},"f":{"docs":{},"f":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}},"o":{"docs":{},"c":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},"a":{"docs":{},"t":{"docs":{},"t":{"docs":{},"r":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},";":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}},"o":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},";":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}},"h":{"docs":{},"a":{"docs":{},"s":{"docs":{},"h":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.002886002886002886},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},"*":{"docs":{},"/":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}},";":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}},"i":{"docs":{},"t":{"docs":{},"e":{"docs":{},"m":{"docs":{},"s":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.005772005772005772},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},";":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}},"r":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},"n":{"docs":{},"e":{"docs":{},"x":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}},"n":{"docs":{},"i":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.007215007215007215},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},",":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}},"e":{"docs":{},"w":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}},"p":{"docs":{},"r":{"docs":{},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.002886002886002886},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},";":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}},"r":{"docs":{},"e":{"docs":{},"p":{"docs":{},"r":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},";":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"v":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.002886002886002886},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}},"i":{"docs":{},"c":{"docs":{},"h":{"docs":{},"c":{"docs":{},"o":{"docs":{},"m":{"docs":{},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"a":{"docs":{},"t":{"docs":{},"t":{"docs":{},"r":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},";":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}},"o":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},";":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}},"t":{"docs":{},"r":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},";":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}},"f":{"docs":{},"l":{"docs":{},"a":{"docs":{},"g":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}},"r":{"docs":{},"e":{"docs":{},"e":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}},"m":{"docs":{},"e":{"docs":{},"m":{"docs":{},"b":{"docs":{},"e":{"docs":{},"r":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"d":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}},"t":{"docs":{},"r":{"docs":{},"a":{"docs":{},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}},"w":{"docs":{},"e":{"docs":{},"a":{"docs":{},"k":{"docs":{},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"o":{"docs":{},"f":{"docs":{},"f":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}}},"y":{"docs":{},"p":{"docs":{},"e":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},"d":{"docs":{},"e":{"docs":{},"f":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.008658008658008658},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0013623978201634877},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}}},"_":{"docs":{},"e":{"docs":{},"r":{"docs":{},"r":{"docs":{},"o":{"docs":{},"r":{"docs":{},"(":{"docs":{},"\"":{"docs":{},"'":{"docs":{},"%":{"docs":{},".":{"2":{"0":{"0":{"docs":{},"s":{"docs":{},"'":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}},"docs":{}},"docs":{}},"docs":{}}}},"s":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}},"h":{"docs":{},"o":{"docs":{},"s":{"docs":{},"e":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"g":{"docs":{},"h":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}},"i":{"docs":{},"r":{"docs":{},"d":{"docs":{},"(":{"docs":{},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}},"a":{"docs":{},"t":{"docs":{},"'":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}},"w":{"docs":{},"o":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}},":":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}}}}},"i":{"docs":{},"m":{"docs":{},"e":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"v":{"3":{"docs":{},".":{"7":{"docs":{},".":{"0":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}},"docs":{}}},"docs":{}}},"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},"i":{"docs":{},"s":{"docs":{},"u":{"docs":{},"a":{"docs":{},"l":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.011363636363636364},"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863}}}}}},"r":{"docs":{},"g":{"docs":{},"i":{"docs":{},"n":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}},";":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}},"a":{"docs":{},"r":{"docs":{},"i":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}},"l":{"docs":{},"u":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0025380710659898475},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.03860127157129882}},"e":{"docs":{},",":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.002270663033605813}}}},".":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0018165304268846503}}},"_":{"docs":{},"a":{"docs":{},"d":{"docs":{},"d":{"docs":{},"r":{"docs":{},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}},"s":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},"是":{"docs":{},"否":{"docs":{},"需":{"docs":{},"要":{"docs":{},"加":{"docs":{},"入":{"docs":{},"垃":{"docs":{},"圾":{"docs":{},"回":{"docs":{},"收":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}},"。":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},",":{"docs":{},"它":{"docs":{},"不":{"docs":{},"会":{"docs":{},"删":{"docs":{},"除":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"并":{"docs":{},"且":{"docs":{},"在":{"docs":{},"此":{"docs":{},"之":{"docs":{},"前":{"docs":{},"也":{"docs":{},"没":{"docs":{},"有":{"docs":{},"存":{"docs":{},"储":{"docs":{},"任":{"docs":{},"何":{"docs":{},"的":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},"o":{"docs":{},"r":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}},"r":{"docs":{},"i":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},"s":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}},":":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}}}},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},"o":{"docs":{},"i":{"docs":{},"d":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}},"y":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.009259259259259259},"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}},"a":{"docs":{},"c":{"docs":{},"c":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}},"u":{"docs":{},"m":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.009259259259259259}}}}},"└":{"docs":{},"─":{"docs":{},"─":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}},"├":{"docs":{},"─":{"docs":{},"─":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.14204545454545456}}}}},"上":{"docs":{},"方":{"docs":{},"便":{"docs":{},"的":{"docs":{},"获":{"docs":{},"取":{"docs":{},",":{"docs":{},"执":{"docs":{},"行":{"docs":{},":":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}}}}}}},"进":{"docs":{},"行":{"docs":{},"编":{"docs":{},"译":{"docs":{},"和":{"docs":{},"开":{"docs":{},"发":{"docs":{"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863}}}}}}}}},"为":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.009259259259259259}}},"可":{"docs":{},"执":{"docs":{},"行":{"docs":{},":":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425}}}}}}},"二":{"docs":{},"进":{"docs":{},"制":{"docs":{},"可":{"docs":{},"执":{"docs":{},"行":{"docs":{},"文":{"docs":{},"件":{"docs":{},"的":{"docs":{},"源":{"docs":{},"码":{"docs":{},"。":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}}}}}}}}}},"亦":{"docs":{},"可":{"docs":{},"执":{"docs":{},"行":{"docs":{},":":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}}},"其":{"docs":{},"中":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},":":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}},"为":{"docs":{},"什":{"docs":{},"么":{"docs":{},"初":{"docs":{},"始":{"docs":{},"化":{"docs":{},"的":{"docs":{},"时":{"docs":{},"候":{"docs":{},"输":{"docs":{},"入":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}},"就":{"docs":{},"调":{"docs":{},"用":{"docs":{},"了":{"docs":{},"字":{"docs":{},"典":{"docs":{},"的":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}},"的":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},",":{"docs":{},"m":{"docs":{},"e":{"docs":{},"_":{"docs":{},"h":{"docs":{},"a":{"docs":{},"s":{"docs":{},"h":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}},"p":{"docs":{},"y":{"docs":{},"d":{"docs":{},"i":{"docs":{},"c":{"docs":{},"t":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},"s":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}},"他":{"docs":{},"情":{"docs":{},"况":{"docs":{},"则":{"docs":{},"需":{"docs":{},"要":{"docs":{},"调":{"docs":{},"用":{"docs":{},"p":{"docs":{},"y":{"docs":{},"m":{"docs":{},"e":{"docs":{},"m":{"docs":{},"_":{"docs":{},"r":{"docs":{},"e":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{},"函":{"docs":{},"数":{"docs":{},"分":{"docs":{},"配":{"docs":{},"新":{"docs":{},"的":{"docs":{},"空":{"docs":{},"间":{"docs":{},"存":{"docs":{},"储":{"docs":{},"列":{"docs":{},"表":{"docs":{},"元":{"docs":{},"素":{"docs":{},"。":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"公":{"docs":{},"式":{"docs":{},"为":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}},"存":{"docs":{},"储":{"docs":{},"结":{"docs":{},"构":{"docs":{},"如":{"docs":{},"下":{"docs":{},"图":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}},"包":{"docs":{},"含":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}},"以":{"docs":{},"下":{"docs":{},"文":{"docs":{},"件":{"docs":{},"(":{"docs":{},"夹":{"docs":{},")":{"docs":{},":":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}}}}}}},"括":{"docs":{},"创":{"docs":{},"建":{"docs":{},"对":{"docs":{},"象":{"docs":{},"需":{"docs":{},"要":{"docs":{},"分":{"docs":{},"配":{"docs":{},"多":{"docs":{},"少":{"docs":{},"内":{"docs":{},"存":{"docs":{},",":{"docs":{},"对":{"docs":{},"象":{"docs":{},"都":{"docs":{},"支":{"docs":{},"持":{"docs":{},"哪":{"docs":{},"些":{"docs":{},"操":{"docs":{},"作":{"docs":{},"等":{"docs":{},"等":{"docs":{},"。":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}}}}}}}}}},"已":{"docs":{},"经":{"docs":{},"使":{"docs":{},"用":{"docs":{},"的":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"r":{"docs":{},"y":{"docs":{},"与":{"docs":{},"空":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"r":{"docs":{},"y":{"docs":{},"值":{"docs":{},"的":{"docs":{},"总":{"docs":{},"和":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}}}}},"所":{"docs":{},"有":{"docs":{},"曾":{"docs":{},"经":{"docs":{},"申":{"docs":{},"请":{"docs":{},"过":{"docs":{},"的":{"docs":{},"数":{"docs":{},"量":{"docs":{},"。":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}},"和":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182},"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863},"objects/object/":{"ref":"objects/object/","tf":0.004329004329004329},"objects/long-object/":{"ref":"objects/long-object/","tf":0.004230118443316413},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},"执":{"docs":{},"行":{"docs":{},"引":{"docs":{},"擎":{"docs":{},"部":{"docs":{},"分":{"docs":{},",":{"docs":{},"是":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}}}}}}},"官":{"docs":{},"方":{"docs":{},"网":{"docs":{},"站":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}},"提":{"docs":{},"供":{"docs":{},"的":{"docs":{},"所":{"docs":{},"有":{"docs":{},"头":{"docs":{},"文":{"docs":{},"件":{"docs":{},",":{"docs":{},"如":{"docs":{},"果":{"docs":{},"用":{"docs":{},"户":{"docs":{},"需":{"docs":{},"要":{"docs":{},"自":{"docs":{},"己":{"docs":{},"用":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}}}}}}}}}}}}}}},"高":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},"的":{"docs":{},"引":{"docs":{},"用":{"docs":{},"计":{"docs":{},"数":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}},"方":{"docs":{},"式":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.011363636363636364}}},"法":{"docs":{},"删":{"docs":{},"除":{"docs":{},"一":{"docs":{},"个":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"就":{"docs":{},"是":{"docs":{},"将":{"docs":{},"生":{"docs":{},"成":{"docs":{},"的":{"docs":{},"方":{"docs":{},"法":{"docs":{},",":{"docs":{},"插":{"docs":{},"入":{"docs":{},"到":{"docs":{},"字":{"docs":{},"典":{"docs":{},"中":{"docs":{},"去":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}},",":{"docs":{},"此":{"docs":{},"时":{"docs":{},"就":{"docs":{},"是":{"docs":{},"调":{"docs":{},"用":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"此":{"docs":{},"时":{"docs":{},"我":{"docs":{},"们":{"docs":{},"分":{"docs":{},"析":{"docs":{},"一":{"docs":{},"下":{"docs":{},",":{"docs":{},"d":{"docs":{},"i":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}},"如":{"docs":{},"下":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}},"来":{"docs":{},"讲":{"docs":{},"对":{"docs":{},"应":{"docs":{},"的":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}},"添":{"docs":{},"加":{"docs":{},"元":{"docs":{},"素":{"docs":{},",":{"docs":{},"调":{"docs":{},"用":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}},"版":{"docs":{},"本":{"docs":{},"的":{"docs":{},"代":{"docs":{},"码":{"docs":{},"。":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.011363636363636364}}}}}}},"的":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}},"目":{"docs":{},"录":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.023148148148148147}},"下":{"docs":{},"则":{"docs":{},"是":{"docs":{},"存":{"docs":{},"放":{"docs":{},"一":{"docs":{},"些":{"docs":{},"对":{"docs":{},"速":{"docs":{},"度":{"docs":{},"没":{"docs":{},"有":{"docs":{},"太":{"docs":{},"严":{"docs":{},"格":{"docs":{},"要":{"docs":{},"求":{"docs":{},"的":{"docs":{},"模":{"docs":{},"块":{"docs":{},",":{"docs":{},"比":{"docs":{},"如":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}}}}}}}}}}}}}}}}}}}}},"结":{"docs":{},"构":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}},":":{"docs":{},"包":{"docs":{},"含":{"docs":{},"了":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.03409090909090909}},"所":{"docs":{},"有":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}},"用":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}}}}}}},"等":{"docs":{},"。":{"docs":{},"同":{"docs":{},"时":{"docs":{},",":{"docs":{},"该":{"docs":{},"目":{"docs":{},"录":{"docs":{},"还":{"docs":{},"包":{"docs":{},"括":{"docs":{},"了":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}}}}}}}},"它":{"docs":{},"们":{"docs":{},"都":{"docs":{},"是":{"docs":{},"那":{"docs":{},"些":{"docs":{},"对":{"docs":{},"速":{"docs":{},"度":{"docs":{},"要":{"docs":{},"求":{"docs":{},"非":{"docs":{},"常":{"docs":{},"严":{"docs":{},"格":{"docs":{},"的":{"docs":{},"模":{"docs":{},"块":{"docs":{},"。":{"docs":{},"而":{"docs":{},"相":{"docs":{},"比":{"docs":{},"而":{"docs":{},"言":{"docs":{},",":{"docs":{},"l":{"docs":{},"i":{"docs":{},"b":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"自":{"docs":{},"带":{"docs":{},"的":{"docs":{},"所":{"docs":{},"有":{"docs":{},"标":{"docs":{},"准":{"docs":{},"库":{"docs":{},",":{"docs":{},"且":{"docs":{},"都":{"docs":{},"是":{"docs":{},"用":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}}}}}}}}}},"身":{"docs":{},"实":{"docs":{},"现":{"docs":{},"的":{"docs":{},"结":{"docs":{},"构":{"docs":{},"中":{"docs":{},"引":{"docs":{},"用":{"docs":{},"了":{"docs":{},"多":{"docs":{},"次":{"docs":{},",":{"docs":{},"所":{"docs":{},"以":{"docs":{},"我":{"docs":{},"们":{"docs":{},"就":{"docs":{},"设":{"docs":{},"置":{"docs":{},"了":{"docs":{},"一":{"docs":{},"个":{"docs":{},"特":{"docs":{},"殊":{"docs":{},"值":{"docs":{},"来":{"docs":{},"跟":{"docs":{},"踪":{"docs":{},"我":{"docs":{},"们":{"docs":{},"想":{"docs":{},"要":{"docs":{},"的":{"docs":{},"字":{"docs":{},"典":{"docs":{},";":{"docs":{},"当":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"解":{"docs":{},"释":{"docs":{},"器":{"docs":{},"中":{"docs":{},"的":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.011363636363636364}}}},"。":{"docs":{"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863}}},"输":{"docs":{},"入":{"docs":{},"如":{"docs":{},"下":{"docs":{},"代":{"docs":{},"码":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}},"决":{"docs":{},"方":{"docs":{},"案":{"docs":{},",":{"docs":{},"而":{"docs":{},"后":{"docs":{},"进":{"docs":{},"行":{"docs":{},"一":{"docs":{},"些":{"docs":{},"设":{"docs":{},"置":{"docs":{},":":{"docs":{"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863}}}}}}}}}}}}}}}},"语":{"docs":{},"言":{"docs":{},"的":{"docs":{},"词":{"docs":{},"法":{"docs":{},"和":{"docs":{},"语":{"docs":{},"法":{"docs":{},"分":{"docs":{},"析":{"docs":{},"器":{"docs":{},",":{"docs":{},"与":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}}}}}}}},"语":{"docs":{},"法":{"docs":{},"自":{"docs":{},"动":{"docs":{},"生":{"docs":{},"成":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}}}}},"编":{"docs":{},"写":{"docs":{},"的":{"docs":{},"。":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}},"模":{"docs":{},"块":{"docs":{},",":{"docs":{},"比":{"docs":{},"如":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}}}}}},"进":{"docs":{},"行":{"docs":{},"扩":{"docs":{},"展":{"docs":{},"。":{"docs":{},"{":{"docs":{},"p":{"docs":{},"l":{"docs":{},"a":{"docs":{},"t":{"docs":{},"f":{"docs":{},"o":{"docs":{},"r":{"docs":{},"m":{"docs":{},"}":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}}}}}}}}}}}}}}},"句":{"docs":{},"即":{"docs":{},"可":{"docs":{},"看":{"docs":{},"到":{"docs":{},"我":{"docs":{},"们":{"docs":{},"希":{"docs":{},"望":{"docs":{},"的":{"docs":{},"结":{"docs":{},"果":{"docs":{},":":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425}}}}}}}}}}}}}}}},"进":{"docs":{},"入":{"docs":{"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863},"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}},"源":{"docs":{},"码":{"docs":{},"目":{"docs":{},"录":{"docs":{},",":{"docs":{},"我":{"docs":{},"们":{"docs":{},"可":{"docs":{},"以":{"docs":{},"看":{"docs":{},"到":{"docs":{},"该":{"docs":{},"目":{"docs":{},"录":{"docs":{},"下":{"docs":{},"主":{"docs":{},"要":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}}}}}}}}}}}}}}}},"行":{"docs":{},"编":{"docs":{},"译":{"docs":{},")":{"docs":{},"。":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}},",":{"docs":{},"选":{"docs":{},"择":{"docs":{},"社":{"docs":{},"区":{"docs":{},"版":{"docs":{},"就":{"docs":{},"足":{"docs":{},"够":{"docs":{},"了":{"docs":{},"。":{"docs":{"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863}}}}}}}}}}}}}}},"了":{"docs":{},"赋":{"docs":{},"值":{"docs":{},"操":{"docs":{},"作":{"docs":{},"与":{"docs":{},"更":{"docs":{},"新":{"docs":{},"操":{"docs":{},"作":{"docs":{},",":{"docs":{},"最":{"docs":{},"后":{"docs":{},"调":{"docs":{},"用":{"docs":{},"了":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}},"部":{"docs":{},"分":{"docs":{},",":{"docs":{},"即":{"docs":{},"对":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}}},"非":{"docs":{},"常":{"docs":{},"类":{"docs":{},"似":{"docs":{},"。":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}}},",":{"docs":{},"下":{"docs":{},"拉":{"docs":{},"至":{"docs":{},"页":{"docs":{},"面":{"docs":{},"最":{"docs":{},"下":{"docs":{},"方":{"docs":{},",":{"docs":{},"可":{"docs":{},"选":{"docs":{},"择":{"docs":{},"下":{"docs":{},"载":{"docs":{"preface/code-organization/":{"ref":"preface/code-organization/","tf":0.005681818181818182}}}}}}}}}}}}}}}},"通":{"docs":{},"过":{"docs":{},"描":{"docs":{},"述":{"docs":{},"可":{"docs":{},"知":{"docs":{},",":{"docs":{},"p":{"docs":{},"y":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"n":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}},">":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565},"objects/list-object/":{"ref":"objects/list-object/","tf":0.00411522633744856},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0032637075718015664}},"“":{"docs":{},"配":{"docs":{},"置":{"docs":{},"”":{"docs":{},"中":{"docs":{},"仅":{"docs":{},"勾":{"docs":{},"选":{"docs":{"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863}}}}}}}}}},">":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/list-object/":{"ref":"objects/list-object/","tf":0.00411522633744856}},">":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425},"objects/long-object/":{"ref":"objects/long-object/","tf":0.004230118443316413},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0036330608537693005}}},"=":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.00338409475465313},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}},"o":{"docs":{},"b":{"docs":{},"_":{"docs":{},"r":{"docs":{},"e":{"docs":{},"f":{"docs":{},"c":{"docs":{},"n":{"docs":{},"t":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}},"+":{"docs":{},"+":{"docs":{},")":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}},"t":{"docs":{},"y":{"docs":{},"p":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0013623978201634877}}}}},"d":{"docs":{},"i":{"docs":{},"g":{"docs":{},"i":{"docs":{},"t":{"docs":{},"[":{"0":{"docs":{},"]":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0013623978201634877}}}}}},"docs":{},"i":{"docs":{},"]":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.00676818950930626}},")":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}},"i":{"docs":{},"t":{"docs":{},"e":{"docs":{},"m":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0054869684499314125}},",":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}},";":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}},"t":{"docs":{},"p":{"docs":{},"_":{"docs":{},"h":{"docs":{},"a":{"docs":{},"s":{"docs":{},"h":{"docs":{},"(":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},")":{"docs":{},";":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}},"a":{"docs":{},"s":{"docs":{},"_":{"docs":{},"m":{"docs":{},"a":{"docs":{},"p":{"docs":{},"p":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}},"s":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},"e":{"docs":{},"n":{"docs":{},"c":{"docs":{},"e":{"docs":{},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}},"l":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{},"(":{"docs":{},"t":{"docs":{},"y":{"docs":{},"p":{"docs":{},"e":{"docs":{},",":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}},"e":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}},"[":{"docs":{},"i":{"docs":{},"]":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}}}}}}}}},"=":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/list-object/":{"ref":"objects/list-object/","tf":0.00411522633744856},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0013623978201634877},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"d":{"docs":{},";":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}},"d":{"docs":{},"k":{"docs":{},"_":{"docs":{},"i":{"docs":{},"n":{"docs":{},"d":{"docs":{},"i":{"docs":{},"c":{"docs":{},"e":{"docs":{},"s":{"docs":{},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}}}},"[":{"0":{"docs":{},"]":{"docs":{},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}},"docs":{}}}}}}}}},"l":{"docs":{},"o":{"docs":{},"o":{"docs":{},"k":{"docs":{},"u":{"docs":{},"p":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0013623978201634877}},"(":{"docs":{},"m":{"docs":{},"p":{"docs":{},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}}}}}}}}}}}},"n":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"r":{"docs":{},"i":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},"e":{"docs":{},"s":{"docs":{},")":{"docs":{},")":{"docs":{},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"+":{"docs":{},"+":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}},"]":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}},"r":{"docs":{},"e":{"docs":{},"f":{"docs":{},"c":{"docs":{},"n":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}},"s":{"docs":{},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"u":{"docs":{},"s":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0018165304268846503}}}}}}}}}},"h":{"docs":{},"a":{"docs":{},"s":{"docs":{},"h":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.00587467362924282}},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}}}}}},"m":{"docs":{},"a":{"docs":{},"_":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.007266121707538601}},"s":{"docs":{},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0013623978201634877}}},"[":{"docs":{},"i":{"docs":{},"x":{"docs":{},"]":{"docs":{},".":{"docs":{},"m":{"docs":{},"e":{"docs":{},"_":{"docs":{},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"u":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}},"m":{"docs":{},"p":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}}}}}}},"u":{"docs":{},"s":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0013623978201634877}},"e":{"docs":{},"d":{"docs":{},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"+":{"docs":{},"+":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}}}}},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"u":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0013623978201634877}},"e":{"docs":{},"s":{"docs":{},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},"[":{"docs":{},"i":{"docs":{},"x":{"docs":{},"]":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}},"m":{"docs":{},"p":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}}}}}}}}}},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"_":{"docs":{},"t":{"docs":{},"a":{"docs":{},"g":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0013623978201634877}}}}}}}}}}}}}},"s":{"docs":{},"k":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0019582245430809398}},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0032637075718015664}}}}}},"e":{"docs":{},"_":{"docs":{},"h":{"docs":{},"a":{"docs":{},"s":{"docs":{},"h":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}}}}}},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0013623978201634877}},")":{"docs":{},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"u":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},"e":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}}}}}}}}}},"p":{"docs":{},"_":{"docs":{},"a":{"docs":{},"s":{"docs":{},"s":{"docs":{},"_":{"docs":{},"s":{"docs":{},"u":{"docs":{},"b":{"docs":{},"s":{"docs":{},"c":{"docs":{},"r":{"docs":{},"i":{"docs":{},"p":{"docs":{},"t":{"docs":{},"(":{"docs":{},"o":{"docs":{},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}},"s":{"docs":{},"q":{"docs":{},"_":{"docs":{},"a":{"docs":{},"s":{"docs":{},"s":{"docs":{},"_":{"docs":{},"i":{"docs":{},"t":{"docs":{},"e":{"docs":{},"m":{"docs":{},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}},"m":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"t":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{},"e":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0019582245430809398}}}}}}}}}}}}},"f":{"docs":{},"i":{"docs":{},"l":{"docs":{},"l":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0026109660574412533}},"*":{"5":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"docs":{}},"+":{"docs":{},"+":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}},"n":{"docs":{},"g":{"docs":{},"e":{"docs":{},"r":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.007832898172323759}},",":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0019582245430809398}}}}}},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}},"d":{"docs":{},")":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}},"*":{"2":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"4":{"docs":{},")":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}},"docs":{}},"+":{"docs":{},"+":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}}},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},">":{"5":{"0":{"0":{"0":{"0":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"docs":{}},"docs":{}},"docs":{}},"docs":{}},"docs":{}}}}}},"w":{"docs":{},"e":{"docs":{},"a":{"docs":{},"k":{"docs":{},"r":{"docs":{},"e":{"docs":{},"f":{"docs":{},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}},"位":{"docs":{},"。":{"docs":{"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863}}},",":{"docs":{},"您":{"docs":{},"也":{"docs":{},"可":{"docs":{},"以":{"docs":{},"根":{"docs":{},"据":{"docs":{},"自":{"docs":{},"己":{"docs":{},"的":{"docs":{},"需":{"docs":{},"求":{"docs":{},"调":{"docs":{},"整":{"docs":{},"成":{"docs":{"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863}}}}}}}}}}}}}}}}},"数":{"docs":{},"的":{"docs":{},"一":{"docs":{},"半":{"docs":{},"。":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}},"系":{"docs":{},"统":{"docs":{},"中":{"docs":{},",":{"docs":{},"p":{"docs":{},"y":{"docs":{},"l":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"_":{"docs":{},"s":{"docs":{},"h":{"docs":{},"i":{"docs":{},"f":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}}}},"及":{"docs":{},"之":{"docs":{},"后":{"docs":{},"的":{"docs":{},"版":{"docs":{},"本":{"docs":{},"可":{"docs":{},"以":{"docs":{},"使":{"docs":{},"用":{"docs":{},"微":{"docs":{},"软":{"docs":{},"的":{"docs":{"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863}}}}}}}}}}}}}}},"可":{"docs":{},"完":{"docs":{},"全":{"docs":{},"通":{"docs":{},"过":{"docs":{},"界":{"docs":{},"面":{"docs":{},"操":{"docs":{},"作":{"docs":{},",":{"docs":{},"主":{"docs":{},"要":{"docs":{},"分":{"docs":{},"为":{"docs":{},"两":{"docs":{},"个":{"docs":{},"步":{"docs":{},"骤":{"docs":{},":":{"docs":{"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863}}}}}}}}}}}}}}}}}}}},"以":{"docs":{},"在":{"docs":{},"创":{"docs":{},"建":{"docs":{},"或":{"docs":{},"复":{"docs":{},"制":{"docs":{},"整":{"docs":{},"数":{"docs":{},"对":{"docs":{},"象":{"docs":{},"等":{"docs":{},"函":{"docs":{},"数":{"docs":{},"中":{"docs":{},"找":{"docs":{},"到":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}}},"看":{"docs":{},"出":{"docs":{},",":{"docs":{},"创":{"docs":{},"建":{"docs":{},"一":{"docs":{},"个":{"docs":{},"整":{"docs":{},"数":{"docs":{},"对":{"docs":{},"象":{"docs":{},"的":{"docs":{},"入":{"docs":{},"口":{"docs":{},"函":{"docs":{},"数":{"docs":{},"为":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}}},"到":{"docs":{},"整":{"docs":{},"数":{"docs":{},"对":{"docs":{},"象":{"docs":{},"的":{"docs":{},"数":{"docs":{},"值":{"docs":{},"操":{"docs":{},"作":{"docs":{},"较":{"docs":{},"多":{"docs":{},",":{"docs":{},"由":{"docs":{},"于":{"docs":{},"篇":{"docs":{},"幅":{"docs":{},"限":{"docs":{},"制":{"docs":{},"无":{"docs":{},"法":{"docs":{},"一":{"docs":{},"一":{"docs":{},"分":{"docs":{},"析":{"docs":{},",":{"docs":{},"这":{"docs":{},"里":{"docs":{},"只":{"docs":{},"分":{"docs":{},"析":{"docs":{},"整":{"docs":{},"数":{"docs":{},"的":{"docs":{},"部":{"docs":{},"分":{"docs":{},"操":{"docs":{},"作":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"的":{"docs":{},"加":{"docs":{},"法":{"docs":{},"运":{"docs":{},"算":{"docs":{},"函":{"docs":{},"数":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}},"转":{"docs":{},"变":{"docs":{},"为":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}}}}}},"见":{"docs":{},"这":{"docs":{},"个":{"docs":{},"变":{"docs":{},"化":{"docs":{},"不":{"docs":{},"是":{"docs":{},"一":{"docs":{},"蹴":{"docs":{},"而":{"docs":{},"就":{"docs":{},"的":{"docs":{},",":{"docs":{},"有":{"docs":{},"比":{"docs":{},"较":{"docs":{},"艰":{"docs":{},"辛":{"docs":{},"的":{"docs":{},"过":{"docs":{},"程":{"docs":{},",":{"docs":{},"大":{"docs":{},"家":{"docs":{},"有":{"docs":{},"兴":{"docs":{},"趣":{"docs":{},"可":{"docs":{},"以":{"docs":{},"去":{"docs":{},"挖":{"docs":{},"掘":{"docs":{},"一":{"docs":{},"下":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"用":{"docs":{},"减":{"docs":{},"1":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"的":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"r":{"docs":{},"y":{"docs":{},"数":{"docs":{},"量":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}},"知":{"docs":{},",":{"docs":{},"删":{"docs":{},"除":{"docs":{},"一":{"docs":{},"个":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"该":{"docs":{},"命":{"docs":{},"令":{"docs":{},"就":{"docs":{},"是":{"docs":{},"讲":{"docs":{},"'":{"1":{"docs":{},"'":{"docs":{},"作":{"docs":{},"为":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"docs":{}}}}}}}}}}},"所":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}},"以":{"docs":{},"需":{"docs":{},"要":{"docs":{},"选":{"docs":{},"择":{"docs":{},"安":{"docs":{},"装":{"docs":{},"该":{"docs":{"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863}}}}}}}}},"来":{"docs":{},"的":{"docs":{},"用":{"docs":{},"于":{"docs":{},"支":{"docs":{},"持":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}}}}},"在":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}},"使":{"docs":{},"用":{"docs":{},"的":{"docs":{"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863}}}}},"依":{"docs":{},"赖":{"docs":{},"的":{"docs":{},"必":{"docs":{},"要":{"docs":{},"环":{"docs":{},"境":{"docs":{},")":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}}}}}}},"定":{"docs":{},"义":{"docs":{},"的":{"docs":{},"操":{"docs":{},"作":{"docs":{},",":{"docs":{},"这":{"docs":{},"些":{"docs":{},"操":{"docs":{},"作":{"docs":{},"直":{"docs":{},"接":{"docs":{},"决":{"docs":{},"定":{"docs":{},"着":{"docs":{},"一":{"docs":{},"个":{"docs":{},"对":{"docs":{},"象":{"docs":{},"在":{"docs":{},"运":{"docs":{},"行":{"docs":{},"时":{"docs":{},"所":{"docs":{},"表":{"docs":{},"现":{"docs":{},"出":{"docs":{},"的":{"docs":{},"行":{"docs":{},"为":{"docs":{},",":{"docs":{},"比":{"docs":{},"如":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"对":{"docs":{},"应":{"docs":{},"的":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}},"更":{"docs":{},"多":{"docs":{},"关":{"docs":{},"于":{"docs":{},"在":{"docs":{"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863}}}}},"内":{"docs":{},"容":{"docs":{"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863}}}},"标":{"docs":{},"准":{"docs":{},"操":{"docs":{},"作":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}},"此":{"docs":{},"外":{"docs":{},",":{"docs":{},"默":{"docs":{},"认":{"docs":{},"情":{"docs":{},"况":{"docs":{},"下":{"docs":{},"的":{"docs":{},"编":{"docs":{},"译":{"docs":{},"设":{"docs":{},"置":{"docs":{},"是":{"docs":{"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863}}}}}}}}}}}}}}},"后":{"docs":{},"我":{"docs":{},"们":{"docs":{},"一":{"docs":{},"直":{"docs":{},"添":{"docs":{},"加":{"docs":{},"值":{"docs":{},"进":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}},"时":{"docs":{},",":{"docs":{},"从":{"docs":{},"栈":{"docs":{},"中":{"docs":{},"取":{"docs":{},"出":{"docs":{},"相":{"docs":{},"关":{"docs":{},"参":{"docs":{},"数":{"docs":{},",":{"docs":{},"并":{"docs":{},"将":{"docs":{},"这":{"docs":{},"些":{"docs":{},"值":{"docs":{},"传":{"docs":{},"入":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}},"基":{"docs":{},"本":{"docs":{},"的":{"docs":{},"流":{"docs":{},"程":{"docs":{},"就":{"docs":{},"是":{"docs":{},"通":{"docs":{},"过":{"docs":{},"传":{"docs":{},"入":{"docs":{},"的":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}},"就":{"docs":{},"会":{"docs":{},"调":{"docs":{},"用":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}},"是":{"docs":{},"查":{"docs":{},"找":{"docs":{},"该":{"docs":{},"值":{"docs":{},",":{"docs":{},"如":{"docs":{},"果":{"docs":{},"找":{"docs":{},"到":{"docs":{},"该":{"docs":{},"值":{"docs":{},"并":{"docs":{},"将":{"docs":{},"该":{"docs":{},"值":{"docs":{},"设":{"docs":{},"置":{"docs":{},"为":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}}}},"继":{"docs":{},"续":{"docs":{},"查":{"docs":{},"看":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}},"由":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}},"于":{"docs":{},"我":{"docs":{},"们":{"docs":{},"只":{"docs":{},"是":{"docs":{},"研":{"docs":{},"究":{"docs":{"preface/windows-build/":{"ref":"preface/windows-build/","tf":0.0136986301369863}}}}}}}}}},"/":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}},"/":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.05092592592592592},"objects/object/":{"ref":"objects/object/","tf":0.03318903318903319},"objects/long-object/":{"ref":"objects/long-object/","tf":0.014382402707275803},"objects/list-object/":{"ref":"objects/list-object/","tf":0.013717421124828532},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.043142597638510444},"objects/set-object/":{"ref":"objects/set-object/","tf":0.06592689295039164}}},"*":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.04184704184704185},"objects/long-object/":{"ref":"objects/long-object/","tf":0.05583756345177665},"objects/list-object/":{"ref":"objects/list-object/","tf":0.006858710562414266},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.009536784741144414},"objects/set-object/":{"ref":"objects/set-object/","tf":0.013054830287206266}},"n":{"docs":{},"b":{"docs":{},"_":{"docs":{},"a":{"docs":{},"d":{"docs":{},"d":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},"*":{"docs":{},"/":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}},"n":{"docs":{},"d":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}},"m":{"docs":{},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{},"i":{"docs":{},"p":{"docs":{},"l":{"docs":{},"y":{"docs":{},"*":{"docs":{},"/":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}},"i":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}},"s":{"docs":{},"u":{"docs":{},"b":{"docs":{},"t":{"docs":{},"r":{"docs":{},"a":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},"*":{"docs":{},"/":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}},"d":{"docs":{},"i":{"docs":{},"v":{"docs":{},"m":{"docs":{},"o":{"docs":{},"d":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}},"f":{"docs":{},"l":{"docs":{},"o":{"docs":{},"a":{"docs":{},"t":{"docs":{},"*":{"docs":{},"/":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},"*":{"docs":{},"/":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}},"l":{"docs":{},"s":{"docs":{},"h":{"docs":{},"i":{"docs":{},"f":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}},"n":{"docs":{},"e":{"docs":{},"g":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}},"o":{"docs":{},"r":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}},"p":{"docs":{},"o":{"docs":{},"w":{"docs":{},"e":{"docs":{},"r":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}},"r":{"docs":{},"e":{"docs":{},"m":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"d":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"v":{"docs":{},"e":{"docs":{},"d":{"docs":{},"*":{"docs":{},"/":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}},"s":{"docs":{},"h":{"docs":{},"i":{"docs":{},"f":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}},"x":{"docs":{},"o":{"docs":{},"r":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}},"[":{"docs":{},"c":{"docs":{},"l":{"docs":{},"i":{"docs":{},"n":{"docs":{},"i":{"docs":{},"c":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0025380710659898475},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}},"t":{"docs":{},"p":{"docs":{},"_":{"docs":{},"a":{"docs":{},"b":{"docs":{},"s":{"docs":{},"o":{"docs":{},"l":{"docs":{},"u":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"l":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}},"p":{"docs":{},"o":{"docs":{},"s":{"docs":{},"i":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}},"b":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.005076142131979695}},"a":{"docs":{},"s":{"docs":{},"h":{"docs":{},")":{"docs":{},"的":{"docs":{},"交":{"docs":{},"互":{"docs":{},"式":{"docs":{},"程":{"docs":{},"序":{"docs":{},"提":{"docs":{},"供":{"docs":{},"了":{"docs":{},"行":{"docs":{},"编":{"docs":{},"辑":{"docs":{},"和":{"docs":{},"历":{"docs":{},"史":{"docs":{},"功":{"docs":{},"能":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}}}}}}}}}}}}}}}}}},"e":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.00338409475465313}},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}},"i":{"docs":{},"n":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}},"i":{"docs":{},"n":{"docs":{},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"l":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425}}}}}}}},"a":{"docs":{},"r":{"docs":{},"i":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}},"y":{"docs":{},"f":{"docs":{},"u":{"docs":{},"n":{"docs":{},"c":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.002886002886002886}}}}}}}}}},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0025380710659898475}}},"g":{"docs":{},"g":{"docs":{},"e":{"docs":{},"r":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}},"z":{"docs":{},"i":{"docs":{},"p":{"2":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.018518518518518517}}},"docs":{}}}},"e":{"docs":{},"f":{"docs":{},"o":{"docs":{},"r":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.02127659574468085},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}},"h":{"docs":{},"a":{"docs":{},"v":{"docs":{},"i":{"docs":{},"o":{"docs":{},"r":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}},":":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},")":{"docs":{},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}}}},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}},"o":{"docs":{},"r":{"docs":{},"r":{"docs":{},"o":{"docs":{},"w":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.00676818950930626}},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}}}}}}}},"y":{"docs":{},"p":{"docs":{},"a":{"docs":{},"s":{"docs":{},"s":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}},"u":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{},"_":{"docs":{},"m":{"docs":{},"a":{"docs":{},"p":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0013623978201634877}}}}},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0032637075718015664}}}}}}}}}}},"e":{"docs":{},"n":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}},"d":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}},"s":{"docs":{},"u":{"docs":{},"r":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}}}}},"u":{"docs":{},"m":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}},"o":{"docs":{},"u":{"docs":{},"g":{"docs":{},"h":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}}}}}},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"r":{"docs":{},"i":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0018165304268846503},"objects/set-object/":{"ref":"objects/set-object/","tf":0.01762402088772846}},"e":{"docs":{},"s":{"docs":{},".":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"*":{"docs":{},"/":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}},"y":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}}}}},"q":{"docs":{},"u":{"docs":{},"a":{"docs":{},"l":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}},"x":{"docs":{},"i":{"docs":{},"t":{"docs":{},":":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},".":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}},"l":{"docs":{},"e":{"docs":{},"m":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"s":{"docs":{},".":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}}}}}}}}}},"m":{"docs":{},"p":{"docs":{},"t":{"docs":{},"i":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}},"y":{"docs":{},",":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}},"t":{"docs":{},"c":{"docs":{},".":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}},".":{"docs":{},"g":{"docs":{},".":{"docs":{},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"a":{"docs":{},"c":{"docs":{},"h":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}},"p":{"0":{"1":{"docs":{},"+":{"docs":{},"+":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"docs":{}},"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.002270663033605813}}},"r":{"docs":{},"r":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}}},"o":{"docs":{},"r":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0013623978201634877},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}}}}},"s":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},"t":{"docs":{},"i":{"docs":{},"m":{"docs":{},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"_":{"docs":{},"s":{"docs":{},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},"(":{"docs":{},"m":{"docs":{},"i":{"docs":{},"n":{"docs":{},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"d":{"docs":{},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}}}}}},"x":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.00338409475465313},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}},"c":{"docs":{},"o":{"docs":{},"d":{"docs":{},"e":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}}},"z":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.009259259259259259}}},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}}},":":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}},"_":{"docs":{},"a":{"docs":{},"d":{"docs":{},"d":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},"(":{"docs":{},"p":{"docs":{},"y":{"docs":{},"l":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}}},"s":{"docs":{},"u":{"docs":{},"b":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},"(":{"docs":{},"p":{"docs":{},"y":{"docs":{},"l":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}},")":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}},"x":{"docs":{},"x":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}},"z":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.005076142131979695}},"l":{"docs":{},"i":{"docs":{},"b":{"1":{"docs":{},"g":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.009259259259259259}}}},"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.013888888888888888}}}}}},"{":{"1":{"docs":{},",":{"2":{"docs":{},"}":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}},"docs":{}}},"2":{"0":{"0":{"0":{"0":{"docs":{},":":{"2":{"docs":{},"}":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0013623978201634877}}}},"docs":{}}},"docs":{}},"docs":{}},"docs":{}},"docs":{}},"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425},"objects/object/":{"ref":"objects/object/","tf":0.020202020202020204},"objects/long-object/":{"ref":"objects/long-object/","tf":0.01692047377326565},"objects/list-object/":{"ref":"objects/list-object/","tf":0.03566529492455418},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.01952770208900999},"objects/set-object/":{"ref":"objects/set-object/","tf":0.02154046997389034}},"p":{"docs":{},"l":{"docs":{},"a":{"docs":{},"t":{"docs":{},"f":{"docs":{},"o":{"docs":{},"r":{"docs":{},"m":{"docs":{},"}":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}}}}}}}},"\"":{"docs":{},"\"":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}},"|":{"docs":{},"o":{"docs":{},"o":{"docs":{},":":{"docs":{},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},"\"":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}},"}":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"“":{"docs":{},"d":{"docs":{},"a":{"docs":{},"r":{"docs":{},"w":{"docs":{},"i":{"docs":{},"n":{"docs":{},"”":{"docs":{},",":{"docs":{},"在":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}}}}}}}},"x":{"8":{"6":{"docs":{},"_":{"6":{"4":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}},"docs":{}},"docs":{}}},"docs":{}},"docs":{}}},"不":{"docs":{},"同":{"docs":{},"的":{"docs":{},"发":{"docs":{},"行":{"docs":{},"版":{"docs":{},",":{"docs":{},"安":{"docs":{},"装":{"docs":{},"方":{"docs":{},"式":{"docs":{},"和":{"docs":{},"包":{"docs":{},"名":{"docs":{},"称":{"docs":{},"也":{"docs":{},"不":{"docs":{},"尽":{"docs":{},"相":{"docs":{},"同":{"docs":{},"。":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}}}}}}}}}}}}}}}}}}},"为":{"docs":{},"空":{"docs":{},"并":{"docs":{},"且":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"的":{"docs":{},"时":{"docs":{},"候":{"docs":{},"出":{"docs":{},"现":{"docs":{},"。":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}},",":{"docs":{},"保":{"docs":{},"存":{"docs":{},"了":{"docs":{},"一":{"docs":{},"个":{"docs":{},"键":{"docs":{},"值":{"docs":{},"对":{"docs":{},",":{"docs":{},"a":{"docs":{},"c":{"docs":{},"t":{"docs":{},"i":{"docs":{},"v":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}},"会":{"docs":{},"改":{"docs":{},"变":{"docs":{},"为":{"docs":{},"一":{"docs":{},"个":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}},"支":{"docs":{},"持":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}},"记":{"docs":{},"录":{"docs":{},"元":{"docs":{},"素":{"docs":{},"位":{"docs":{},"置":{"docs":{},"或":{"docs":{},"者":{"docs":{},"插":{"docs":{},"入":{"docs":{},"点":{"docs":{},"。":{"docs":{},"因":{"docs":{},"此":{"docs":{},",":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}}},"中":{"docs":{},"通":{"docs":{},"常":{"docs":{},"已":{"docs":{},"具":{"docs":{},"备":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}}}},"打":{"docs":{},"印":{"docs":{},"对":{"docs":{},"象":{"docs":{},"的":{"docs":{},"接":{"docs":{},"口":{"docs":{},":":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425}}}}}}}}}},"的":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}},"原":{"docs":{},"生":{"docs":{},"字":{"docs":{},"符":{"docs":{},"数":{"docs":{},"组":{"docs":{},"转":{"docs":{},"换":{"docs":{},"为":{"docs":{},"出":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425}}}}}}}}}}}},"字":{"docs":{},"符":{"docs":{},"串":{"docs":{},"(":{"docs":{},"u":{"docs":{},"n":{"docs":{},"i":{"docs":{},"c":{"docs":{},"o":{"docs":{},"d":{"docs":{},"e":{"docs":{},")":{"docs":{},"对":{"docs":{},"象":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425}}}}}}}}}}}}}}}},"所":{"docs":{},"有":{"docs":{},"对":{"docs":{},"象":{"docs":{},"都":{"docs":{},"拥":{"docs":{},"有":{"docs":{},"一":{"docs":{},"些":{"docs":{},"相":{"docs":{},"同":{"docs":{},"的":{"docs":{},"内":{"docs":{},"容":{"docs":{},",":{"docs":{},"而":{"docs":{},"这":{"docs":{},"些":{"docs":{},"内":{"docs":{},"容":{"docs":{},"就":{"docs":{},"定":{"docs":{},"义":{"docs":{},"在":{"docs":{},"p":{"docs":{},"y":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},"中":{"docs":{},",":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"每":{"docs":{},"个":{"docs":{},"东":{"docs":{},"西":{"docs":{},"都":{"docs":{},"是":{"docs":{},"一":{"docs":{},"个":{"docs":{},"对":{"docs":{},"象":{"docs":{},",":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}},"大":{"docs":{},"量":{"docs":{},"采":{"docs":{},"用":{"docs":{},"了":{"docs":{},"内":{"docs":{},"存":{"docs":{},"对":{"docs":{},"象":{"docs":{},"池":{"docs":{},"的":{"docs":{},"技":{"docs":{},"术":{"docs":{},",":{"docs":{},"使":{"docs":{},"得":{"docs":{},"对":{"docs":{},"象":{"docs":{},"释":{"docs":{},"放":{"docs":{},"的":{"docs":{},"空":{"docs":{},"间":{"docs":{},"归":{"docs":{},"还":{"docs":{},"给":{"docs":{},"内":{"docs":{},"存":{"docs":{},"池":{"docs":{},"而":{"docs":{},"不":{"docs":{},"是":{"docs":{},"直":{"docs":{},"接":{"docs":{},"f":{"docs":{},"r":{"docs":{},"e":{"docs":{},"e":{"docs":{},",":{"docs":{},"后":{"docs":{},"续":{"docs":{},"使":{"docs":{},"用":{"docs":{},"可":{"docs":{},"先":{"docs":{},"从":{"docs":{},"对":{"docs":{},"象":{"docs":{},"池":{"docs":{},"中":{"docs":{},"获":{"docs":{},"取":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"定":{"docs":{},"义":{"docs":{},"了":{"docs":{},"大":{"docs":{},"量":{"docs":{},"的":{"docs":{},"函":{"docs":{},"数":{"docs":{},"指":{"docs":{},"针":{"docs":{},"。":{"docs":{},"这":{"docs":{},"些":{"docs":{},"函":{"docs":{},"数":{"docs":{},"指":{"docs":{},"针":{"docs":{},"可":{"docs":{},"以":{"docs":{},"视":{"docs":{},"为":{"docs":{},"类":{"docs":{},"型":{"docs":{},"对":{"docs":{},"象":{"docs":{},"中":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}}}}}}}}}}},"提":{"docs":{},"供":{"docs":{},"了":{"docs":{},"几":{"docs":{},"个":{"docs":{},"有":{"docs":{},"用":{"docs":{},"的":{"docs":{},"宏":{"docs":{},":":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}},",":{"docs":{},"主":{"docs":{},"要":{"docs":{},"通":{"docs":{},"过":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}},"每":{"docs":{},"一":{"docs":{},"个":{"docs":{},"对":{"docs":{},"象":{"docs":{},"都":{"docs":{},"将":{"docs":{},"自":{"docs":{},"己":{"docs":{},"的":{"docs":{},"引":{"docs":{},"用":{"docs":{},"计":{"docs":{},"数":{"docs":{},"、":{"docs":{},"类":{"docs":{},"型":{"docs":{},"信":{"docs":{},"息":{"docs":{},"保":{"docs":{},"存":{"docs":{},"在":{"docs":{},"开":{"docs":{},"始":{"docs":{},"的":{"docs":{},"部":{"docs":{},"分":{"docs":{},"中":{"docs":{},"。":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"在":{"docs":{},"一":{"docs":{},"个":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}},"此":{"docs":{},"时":{"docs":{},"查":{"docs":{},"看":{"docs":{},"该":{"docs":{},"执":{"docs":{},"行":{"docs":{},"函":{"docs":{},"数":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}},"如":{"docs":{},"果":{"docs":{},"相":{"docs":{},"同":{"docs":{},"则":{"docs":{},"不":{"docs":{},"插":{"docs":{},"入":{"docs":{},",":{"docs":{},"如":{"docs":{},"果":{"docs":{},"索":{"docs":{},"引":{"docs":{},"对":{"docs":{},"应":{"docs":{},"的":{"docs":{},"值":{"docs":{},"且":{"docs":{},"值":{"docs":{},"不":{"docs":{},"同":{"docs":{},",":{"docs":{},"则":{"docs":{},"遍":{"docs":{},"历":{"docs":{},"从":{"docs":{},"该":{"docs":{},"索":{"docs":{},"引":{"docs":{},"往":{"docs":{},"后":{"docs":{},"9":{"docs":{},"个":{"docs":{},"位":{"docs":{},"置":{"docs":{},"的":{"docs":{},"值":{"docs":{},",":{"docs":{},"依":{"docs":{},"次":{"docs":{},"找":{"docs":{},"到":{"docs":{},"有":{"docs":{},"空":{"docs":{},"余":{"docs":{},"位":{"docs":{},"置":{"docs":{},"的":{"docs":{},"值":{"docs":{},",":{"docs":{},"并":{"docs":{},"将":{"docs":{},"该":{"docs":{},"值":{"docs":{},"设":{"docs":{},"置":{"docs":{},"进":{"docs":{},"去":{"docs":{},"。":{"docs":{},"如":{"docs":{},"果":{"docs":{},"设":{"docs":{},"置":{"docs":{},"该":{"docs":{},"值":{"docs":{},"之":{"docs":{},"后":{"docs":{},"使":{"docs":{},"用":{"docs":{},"的":{"docs":{},"数":{"docs":{},"量":{"docs":{},"占":{"docs":{},"总":{"docs":{},"的":{"docs":{},"申":{"docs":{},"请":{"docs":{},"数":{"docs":{},"量":{"docs":{},"超":{"docs":{},"过":{"docs":{},"了":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"对":{"docs":{},"应":{"docs":{},"的":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}},"删":{"docs":{},"除":{"docs":{},"一":{"docs":{},"个":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"对":{"docs":{},"应":{"docs":{},"的":{"docs":{},"该":{"docs":{},"值":{"docs":{},",":{"docs":{},"而":{"docs":{},"只":{"docs":{},"是":{"docs":{},"将":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}},"添":{"docs":{},"加":{"docs":{},"内":{"docs":{},"容":{"docs":{},"时":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}},"代":{"docs":{},"表":{"docs":{},"平":{"docs":{},"台":{"docs":{},",":{"docs":{},"比":{"docs":{},"如":{"docs":{},"在":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}}}}}}},"再":{"docs":{},"执":{"docs":{},"行":{"docs":{},"本":{"docs":{},"节":{"docs":{},"开":{"docs":{},"头":{"docs":{},"处":{"docs":{},"的":{"docs":{},"命":{"docs":{},"令":{"docs":{},"即":{"docs":{},"可":{"docs":{},"。":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}}}}}}}}}}}}},"压":{"docs":{},"缩":{"docs":{},"、":{"docs":{},"解":{"docs":{},"压":{"docs":{},"相":{"docs":{},"关":{"docs":{},"库":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}}}}},"库":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}},"解":{"docs":{},"压":{"docs":{},"工":{"docs":{},"具":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}}}}},"发":{"docs":{},"行":{"docs":{},"版":{"docs":{},"可":{"docs":{},"能":{"docs":{},"会":{"docs":{},"有":{"docs":{},"较":{"docs":{},"多":{"docs":{},"的":{"docs":{},"库":{"docs":{},"未":{"docs":{},"安":{"docs":{},"装":{"docs":{},",":{"docs":{},"除":{"docs":{},"了":{"docs":{},"安":{"docs":{},"装":{"docs":{},"上":{"docs":{},"一":{"docs":{},"小":{"docs":{},"节":{"docs":{},"提":{"docs":{},"及":{"docs":{},"的":{"docs":{},"库":{"docs":{},"外":{"docs":{},",":{"docs":{},"其":{"docs":{},"他":{"docs":{},"缺":{"docs":{},"失":{"docs":{},"库":{"docs":{},"可":{"docs":{},"根":{"docs":{},"据":{"docs":{},"情":{"docs":{},"况":{"docs":{},"自":{"docs":{},"行":{"docs":{},"安":{"docs":{},"装":{"docs":{},":":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"图":{"docs":{},"形":{"docs":{},"用":{"docs":{},"户":{"docs":{},"界":{"docs":{},"面":{"docs":{},"开":{"docs":{},"发":{"docs":{},"工":{"docs":{},"具":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}}}}}}}}},"如":{"docs":{},"需":{"docs":{},"重":{"docs":{},"新":{"docs":{},"编":{"docs":{},"译":{"docs":{},",":{"docs":{},"请":{"docs":{},"首":{"docs":{},"先":{"docs":{},"执":{"docs":{},"行":{"docs":{},":":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}}}}}}}}}}},"p":{"docs":{},"y":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},"_":{"docs":{},"n":{"docs":{},"e":{"docs":{},"w":{"docs":{},"。":{"docs":{},"创":{"docs":{},"建":{"docs":{},"一":{"docs":{},"个":{"docs":{},"整":{"docs":{},"数":{"docs":{},"对":{"docs":{},"象":{"docs":{},"的":{"docs":{},"方":{"docs":{},"式":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}}}}}}}}},"果":{"docs":{},"传":{"docs":{},"递":{"docs":{},"给":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}},"指":{"docs":{},"针":{"docs":{},"是":{"docs":{},"一":{"docs":{},"个":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},"相":{"docs":{},"同":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},"则":{"docs":{},"跳":{"docs":{},"转":{"docs":{},"到":{"docs":{},"f":{"docs":{},"o":{"docs":{},"u":{"docs":{},"n":{"docs":{},"d":{"docs":{},"_":{"docs":{},"a":{"docs":{},"c":{"docs":{},"t":{"docs":{},"i":{"docs":{},"v":{"docs":{},"e":{"docs":{},"处":{"docs":{},"执":{"docs":{},"行":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}}}}}}}},"m":{"docs":{},"p":{"docs":{},"的":{"docs":{},"m":{"docs":{},"a":{"docs":{},"_":{"docs":{},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"有":{"docs":{},"值":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}},"不":{"docs":{},"为":{"docs":{},"空":{"docs":{},"则":{"docs":{},"保":{"docs":{},"存":{"docs":{},"的":{"docs":{},"是":{"docs":{},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"u":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}},"相":{"docs":{},"同":{"docs":{},"则":{"docs":{},"重":{"docs":{},"置":{"docs":{},"f":{"docs":{},"i":{"docs":{},"l":{"docs":{},"l":{"docs":{},"为":{"docs":{},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"d":{"docs":{},"的":{"docs":{},"值":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}},"能":{"docs":{},"h":{"docs":{},"a":{"docs":{},"s":{"docs":{},"h":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"则":{"docs":{},"返":{"docs":{},"回":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}},"为":{"docs":{},"空":{"docs":{},"则":{"docs":{},"证":{"docs":{},"明":{"docs":{},"找":{"docs":{},"到":{"docs":{},"一":{"docs":{},"个":{"docs":{},"可":{"docs":{},"以":{"docs":{},"使":{"docs":{},"用":{"docs":{},"的":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}},"申":{"docs":{},"请":{"docs":{},"内":{"docs":{},"存":{"docs":{},"失":{"docs":{},"败":{"docs":{},"报":{"docs":{},"错":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}},"跳":{"docs":{},"转":{"docs":{},"值":{"docs":{},"f":{"docs":{},"o":{"docs":{},"u":{"docs":{},"n":{"docs":{},"d":{"docs":{},"_":{"docs":{},"n":{"docs":{},"u":{"docs":{},"l":{"docs":{},"l":{"docs":{},"设":{"docs":{},"置":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},"与":{"docs":{},"h":{"docs":{},"a":{"docs":{},"s":{"docs":{},"h":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}}}}},"到":{"docs":{},"f":{"docs":{},"o":{"docs":{},"u":{"docs":{},"n":{"docs":{},"d":{"docs":{},"_":{"docs":{},"n":{"docs":{},"u":{"docs":{},"l":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}},"新":{"docs":{},"建":{"docs":{},"失":{"docs":{},"败":{"docs":{},"则":{"docs":{},"报":{"docs":{},"错":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}},"是":{"docs":{},"分":{"docs":{},"离":{"docs":{},"的":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}},"u":{"docs":{},"n":{"docs":{},"i":{"docs":{},"c":{"docs":{},"o":{"docs":{},"d":{"docs":{},"e":{"docs":{},",":{"docs":{},"通":{"docs":{},"过":{"docs":{},"类":{"docs":{},"型":{"docs":{},"转":{"docs":{},"换":{"docs":{},"检":{"docs":{},"查":{"docs":{},"两":{"docs":{},"个":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},"的":{"docs":{},"内":{"docs":{},"容":{"docs":{},"是":{"docs":{},"否":{"docs":{},"相":{"docs":{},"同":{"docs":{},",":{"docs":{},"如":{"docs":{},"果":{"docs":{},"不":{"docs":{},"相":{"docs":{},"同":{"docs":{},"则":{"docs":{},"跳":{"docs":{},"转":{"docs":{},"到":{"docs":{},"f":{"docs":{},"o":{"docs":{},"u":{"docs":{},"n":{"docs":{},"d":{"docs":{},"_":{"docs":{},"a":{"docs":{},"c":{"docs":{},"t":{"docs":{},"i":{"docs":{},"v":{"docs":{},"e":{"docs":{},"处":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"其":{"docs":{},"他":{"docs":{},"类":{"docs":{},"型":{"docs":{},"的":{"docs":{},"对":{"docs":{},"象":{"docs":{},"则":{"docs":{},"调":{"docs":{},"用":{"docs":{},"比":{"docs":{},"较":{"docs":{},"方":{"docs":{},"法":{"docs":{},"去":{"docs":{},"比":{"docs":{},"较":{"docs":{},"两":{"docs":{},"个":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},"是":{"docs":{},"否":{"docs":{},"相":{"docs":{},"同":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"有":{"docs":{},"则":{"docs":{},"是":{"docs":{},"保":{"docs":{},"存":{"docs":{},"的":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},"s":{"docs":{},"数":{"docs":{},"据":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}},"设":{"docs":{},"置":{"docs":{},"该":{"docs":{},"类":{"docs":{},"型":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"迭":{"docs":{},"代":{"docs":{},"器":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}},"错":{"docs":{},"误":{"docs":{},"就":{"docs":{},"报":{"docs":{},"错":{"docs":{},"处":{"docs":{},"理":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"改":{"docs":{},"变":{"docs":{},"了":{"docs":{},"则":{"docs":{},"重":{"docs":{},"新":{"docs":{},"开":{"docs":{},"始":{"docs":{},"查":{"docs":{},"找":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}},"两":{"docs":{},"个":{"docs":{},"表":{"docs":{},"相":{"docs":{},"同":{"docs":{},"则":{"docs":{},"删":{"docs":{},"除":{"docs":{},"旧":{"docs":{},"t":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}},"使":{"docs":{},"用":{"docs":{},"的":{"docs":{},"与":{"docs":{},"曾":{"docs":{},"经":{"docs":{},"使":{"docs":{},"用":{"docs":{},"的":{"docs":{},"数":{"docs":{},"量":{"docs":{},"相":{"docs":{},"同":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}},"相":{"docs":{},"同":{"docs":{},"则":{"docs":{},"什":{"docs":{},"么":{"docs":{},"都":{"docs":{},"不":{"docs":{},"做":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}},"值":{"docs":{},"不":{"docs":{},"为":{"docs":{},"空":{"docs":{},"则":{"docs":{},"插":{"docs":{},"入":{"docs":{},"到":{"docs":{},"新":{"docs":{},"的":{"docs":{},"t":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{},"e":{"docs":{},"中":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}},"已":{"docs":{},"使":{"docs":{},"用":{"docs":{},"的":{"docs":{},"总":{"docs":{},"数":{"docs":{},"大":{"docs":{},"于":{"3":{"docs":{},"/":{"5":{"docs":{},"则":{"docs":{},"重":{"docs":{},"新":{"docs":{},"调":{"docs":{},"整":{"docs":{},"t":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{},"e":{"docs":{},",":{"docs":{},"如":{"docs":{},"果":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"使":{"docs":{},"用":{"docs":{},"的":{"docs":{},"总":{"docs":{},"数":{"docs":{},"超":{"docs":{},"过":{"docs":{},"了":{"5":{"0":{"0":{"0":{"0":{"docs":{},"则":{"docs":{},"扩":{"docs":{},"展":{"docs":{},"为":{"docs":{},"以":{"docs":{},"前":{"docs":{},"的":{"docs":{},"2":{"docs":{},"倍":{"docs":{},"否":{"docs":{},"则":{"docs":{},"就":{"docs":{},"是":{"docs":{},"四":{"docs":{},"倍":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}},"docs":{}},"docs":{}},"docs":{}},"docs":{}},"docs":{}}}}}}}}}}}}}}}}}}}}}}}}}},"docs":{}}},"docs":{}}}}}}}}},"当":{"docs":{},"前":{"docs":{},"h":{"docs":{},"a":{"docs":{},"s":{"docs":{},"h":{"docs":{},"值":{"docs":{},"相":{"docs":{},"等":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}},"找":{"docs":{},"到":{"docs":{},"为":{"docs":{},"空":{"docs":{},"则":{"docs":{},"直":{"docs":{},"接":{"docs":{},"跳":{"docs":{},"转":{"docs":{},"到":{"docs":{},"f":{"docs":{},"o":{"docs":{},"u":{"docs":{},"n":{"docs":{},"d":{"docs":{},"_":{"docs":{},"u":{"docs":{},"n":{"docs":{},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"d":{"docs":{},"_":{"docs":{},"o":{"docs":{},"r":{"docs":{},"_":{"docs":{},"d":{"docs":{},"u":{"docs":{},"m":{"docs":{},"m":{"docs":{},"y":{"docs":{},"处":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"了":{"docs":{},"该":{"docs":{},"值":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}},"则":{"docs":{},"跳":{"docs":{},"转":{"docs":{},"到":{"docs":{},"f":{"docs":{},"o":{"docs":{},"u":{"docs":{},"n":{"docs":{},"d":{"docs":{},"_":{"docs":{},"a":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}},"当":{"docs":{},"前":{"docs":{},"h":{"docs":{},"a":{"docs":{},"s":{"docs":{},"h":{"docs":{},"为":{"docs":{},"空":{"docs":{},"或":{"docs":{},"者":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},"为":{"docs":{},"空":{"docs":{},"的":{"docs":{},"则":{"docs":{},"跳":{"docs":{},"转":{"docs":{},"到":{"docs":{},"f":{"docs":{},"o":{"docs":{},"u":{"docs":{},"n":{"docs":{},"d":{"docs":{},"_":{"docs":{},"u":{"docs":{},"n":{"docs":{},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"d":{"docs":{},"_":{"docs":{},"o":{"docs":{},"r":{"docs":{},"_":{"docs":{},"d":{"docs":{},"u":{"docs":{},"m":{"docs":{},"m":{"docs":{},"y":{"docs":{},"处":{"docs":{},"执":{"docs":{},"行":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"的":{"docs":{},"h":{"docs":{},"a":{"docs":{},"s":{"docs":{},"h":{"docs":{},"值":{"docs":{},"相":{"docs":{},"同":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}},"值":{"docs":{},"与":{"docs":{},"传":{"docs":{},"入":{"docs":{},"需":{"docs":{},"要":{"docs":{},"设":{"docs":{},"置":{"docs":{},"的":{"docs":{},"值":{"docs":{},"相":{"docs":{},"同":{"docs":{},"则":{"docs":{},"跳":{"docs":{},"转":{"docs":{},"到":{"docs":{},"f":{"docs":{},"o":{"docs":{},"u":{"docs":{},"n":{"docs":{},"d":{"docs":{},"_":{"docs":{},"a":{"docs":{},"c":{"docs":{},"t":{"docs":{},"i":{"docs":{},"v":{"docs":{},"e":{"docs":{},"处":{"docs":{},"执":{"docs":{},"行":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"比":{"docs":{},"较":{"docs":{},"失":{"docs":{},"败":{"docs":{},"则":{"docs":{},"返":{"docs":{},"回":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}},"没":{"docs":{},"有":{"docs":{},"找":{"docs":{},"到":{"docs":{},"则":{"docs":{},"获":{"docs":{},"取":{"docs":{},"下":{"docs":{},"一":{"docs":{},"个":{"docs":{},"索":{"docs":{},"引":{"docs":{},"值":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}},"返":{"docs":{},"回":{"docs":{},"-":{"docs":{},"1":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}},",":{"docs":{},"则":{"docs":{},"获":{"docs":{},"取":{"docs":{},"当":{"docs":{},"前":{"docs":{},"t":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{},"e":{"docs":{},"的":{"docs":{},"头":{"docs":{},"部":{"docs":{},"节":{"docs":{},"点":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}}}},"相":{"docs":{},"同":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}},"获":{"docs":{},"取":{"docs":{},"的":{"docs":{},"新":{"docs":{},"大":{"docs":{},"小":{"docs":{},"与":{"docs":{},"p":{"docs":{},"y":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"_":{"docs":{},"m":{"docs":{},"i":{"docs":{},"n":{"docs":{},"s":{"docs":{},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},"的":{"docs":{},"大":{"docs":{},"小":{"docs":{},"相":{"docs":{},"同":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}}}}}}},"索":{"docs":{},"引":{"docs":{},"的":{"docs":{},"值":{"docs":{},"没":{"docs":{},"有":{"docs":{},"被":{"docs":{},"使":{"docs":{},"用":{"docs":{},"则":{"docs":{},"直":{"docs":{},"接":{"docs":{},"跳":{"docs":{},"转":{"docs":{},"到":{"docs":{},"f":{"docs":{},"o":{"docs":{},"u":{"docs":{},"n":{"docs":{},"d":{"docs":{},"_":{"docs":{},"u":{"docs":{},"n":{"docs":{},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"d":{"docs":{},"处":{"docs":{},"执":{"docs":{},"行":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"下":{"docs":{},"图":{"docs":{},"所":{"docs":{},"示":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}},"存":{"docs":{},"放":{"docs":{},"的":{"docs":{},"是":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.013888888888888888}},"可":{"docs":{},"执":{"docs":{},"行":{"docs":{},"文":{"docs":{},"件":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}}}},"帮":{"docs":{},"助":{"docs":{},"等":{"docs":{},"文":{"docs":{},"件":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}}}}}}}},"将":{"docs":{},"会":{"docs":{},"被":{"docs":{},"编":{"docs":{},"译":{"docs":{},",":{"docs":{},"并":{"docs":{},"安":{"docs":{},"装":{"docs":{},"在":{"docs":{},"默":{"docs":{},"认":{"docs":{},"目":{"docs":{},"录":{"docs":{},"中":{"docs":{},"。":{"docs":{},"若":{"docs":{},"您":{"docs":{},"希":{"docs":{},"望":{"docs":{},"将":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}}}}}}}}}}}}}}}}}}},"元":{"docs":{},"素":{"docs":{},"插":{"docs":{},"入":{"docs":{},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"尾":{"docs":{},"部":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}},"指":{"docs":{},"定":{"docs":{},"位":{"docs":{},"置":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}},"要":{"docs":{},"插":{"docs":{},"入":{"docs":{},"的":{"docs":{},"位":{"docs":{},"置":{"docs":{},"的":{"docs":{},"元":{"docs":{},"素":{"docs":{},"都":{"docs":{},"往":{"docs":{},"后":{"docs":{},"移":{"docs":{},"一":{"docs":{},"个":{"docs":{},"位":{"docs":{},"置":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}}}}}}}}},"申":{"docs":{},"请":{"docs":{},"的":{"docs":{},"内":{"docs":{},"存":{"docs":{},"置":{"docs":{},"空":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}},"该":{"docs":{},"值":{"docs":{},"赋":{"docs":{},"值":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},"设":{"docs":{},"置":{"docs":{},"为":{"docs":{},"d":{"docs":{},"u":{"docs":{},"m":{"docs":{},"m":{"docs":{},"i":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}},"传":{"docs":{},"入":{"docs":{},"初":{"docs":{},"始":{"docs":{},"化":{"docs":{},"的":{"docs":{},"参":{"docs":{},"数":{"docs":{},"传":{"docs":{},"入":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}},"保":{"docs":{},"存":{"docs":{},"数":{"docs":{},"据":{"docs":{},"的":{"docs":{},"头":{"docs":{},"指":{"docs":{},"针":{"docs":{},"指":{"docs":{},"向":{"docs":{},"t":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}},"内":{"docs":{},"容":{"docs":{},"更":{"docs":{},"新":{"docs":{},"到":{"docs":{},"s":{"docs":{},"o":{"docs":{},"中":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}},"数":{"docs":{},"据":{"docs":{},"拷":{"docs":{},"贝":{"docs":{},"到":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"_":{"docs":{},"l":{"docs":{},"o":{"docs":{},"o":{"docs":{},"k":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},"中":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}},"小":{"docs":{},"型":{"docs":{},"的":{"docs":{},"数":{"docs":{},"据":{"docs":{},"库":{"docs":{},"系":{"docs":{},"统":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}}}}}},"整":{"docs":{},"数":{"docs":{},"初":{"docs":{},"始":{"docs":{},"化":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}},"对":{"docs":{},"象":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}},"常":{"docs":{},"规":{"docs":{},"操":{"docs":{},"作":{"docs":{},"系":{"docs":{},"统":{"docs":{},"中":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}}}}}},"扩":{"docs":{},"展":{"docs":{},"的":{"docs":{},"库":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}}},"操":{"docs":{},"作":{"docs":{},"库":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}},"t":{"docs":{},"p":{"docs":{},"_":{"docs":{},"h":{"docs":{},"a":{"docs":{},"s":{"docs":{},"h":{"docs":{},",":{"docs":{},"t":{"docs":{},"p":{"docs":{},"_":{"docs":{},"h":{"docs":{},"a":{"docs":{},"s":{"docs":{},"h":{"docs":{},"可":{"docs":{},"以":{"docs":{},"在":{"docs":{},"p":{"docs":{},"y":{"docs":{},"t":{"docs":{},"y":{"docs":{},"p":{"docs":{},"e":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},"中":{"docs":{},"找":{"docs":{},"到":{"docs":{},",":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},",":{"docs":{},"查":{"docs":{},"看":{"docs":{},"源":{"docs":{},"码":{"docs":{},"可":{"docs":{},"以":{"docs":{},"看":{"docs":{},"到":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}},"是":{"docs":{},"一":{"docs":{},"个":{"docs":{},"软":{"docs":{},"件":{"docs":{},"库":{"docs":{},",":{"docs":{},"它":{"docs":{},"为":{"docs":{},"使":{"docs":{},"用":{"docs":{},"命":{"docs":{},"令":{"docs":{},"行":{"docs":{},"界":{"docs":{},"面":{"docs":{},"(":{"docs":{},"如":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}}}}}}}}}}}}}},"变":{"docs":{},"长":{"docs":{},"对":{"docs":{},"象":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}},"动":{"docs":{},"态":{"docs":{},"链":{"docs":{},"接":{"docs":{},"(":{"docs":{},"l":{"docs":{},"i":{"docs":{},"b":{"docs":{},"p":{"docs":{},"y":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"n":{"3":{"docs":{},".":{"7":{"docs":{},"m":{"docs":{},".":{"docs":{},"s":{"docs":{},"o":{"docs":{},")":{"docs":{},",":{"docs":{},"则":{"docs":{},"需":{"docs":{},"要":{"docs":{},"在":{"docs":{},"一":{"docs":{},"开":{"docs":{},"始":{"docs":{},"修":{"docs":{},"改":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"f":{"docs":{},"i":{"docs":{},"g":{"docs":{},"u":{"docs":{},"r":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}}}}}}}}}}}}}}}}}}}}}}},"docs":{}}},"docs":{}}}}}}}}}}}}}}},"静":{"docs":{},"态":{"docs":{},"链":{"docs":{},"接":{"docs":{},"(":{"docs":{},"l":{"docs":{},"i":{"docs":{},"b":{"docs":{},"p":{"docs":{},"y":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"n":{"3":{"docs":{},".":{"7":{"docs":{},"m":{"docs":{},".":{"docs":{},"a":{"docs":{},")":{"docs":{},"。":{"docs":{},"如":{"docs":{},"果":{"docs":{},"希":{"docs":{},"望":{"docs":{},"编":{"docs":{},"译":{"docs":{},"的":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}}}}}}}}}}}},"docs":{}}},"docs":{}}}}}}}}}}}}}}},"怎":{"docs":{},"么":{"docs":{},"与":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}},"变":{"docs":{},"长":{"docs":{},"对":{"docs":{},"象":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}},"由":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}},"否":{"docs":{},"有":{"docs":{},"缓":{"docs":{},"存":{"docs":{},",":{"docs":{},"如":{"docs":{},"果":{"docs":{},"有":{"docs":{},"缓":{"docs":{},"存":{"docs":{},"就":{"docs":{},"选":{"docs":{},"择":{"docs":{},"缓":{"docs":{},"存":{"docs":{},"中":{"docs":{},"的":{"docs":{},"d":{"docs":{},"k":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}},"可":{"docs":{},"用":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}},"能":{"docs":{},"够":{"docs":{},"被":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}},"无":{"docs":{},"序":{"docs":{},"且":{"docs":{},"不":{"docs":{},"重":{"docs":{},"复":{"docs":{},"的":{"docs":{},"集":{"docs":{},"合":{"docs":{},",":{"docs":{},"是":{"docs":{},"可":{"docs":{},"变":{"docs":{},"的":{"docs":{},",":{"docs":{},"通":{"docs":{},"常":{"docs":{},"用":{"docs":{},"来":{"docs":{},"从":{"docs":{},"列":{"docs":{},"表":{"docs":{},"中":{"docs":{},"删":{"docs":{},"除":{"docs":{},"重":{"docs":{},"复":{"docs":{},"项":{"docs":{},"以":{"docs":{},"及":{"docs":{},"计":{"docs":{},"算":{"docs":{},"数":{"docs":{},"学":{"docs":{},"运":{"docs":{},"算":{"docs":{},",":{"docs":{},"如":{"docs":{},"交":{"docs":{},"集":{"docs":{},"、":{"docs":{},"并":{"docs":{},"集":{"docs":{},"、":{"docs":{},"差":{"docs":{},"分":{"docs":{},"和":{"docs":{},"对":{"docs":{},"称":{"docs":{},"差":{"docs":{},"分":{"docs":{},"等":{"docs":{},"集":{"docs":{},"合":{"docs":{},"操":{"docs":{},"作":{"docs":{},"。":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"标":{"docs":{},"准":{"docs":{},"库":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}},"类":{"docs":{},"方":{"docs":{},"法":{"docs":{},"集":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}},"跨":{"docs":{},"平":{"docs":{},"台":{"docs":{},"的":{"docs":{},"开":{"docs":{},"源":{"docs":{},"的":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}}}}}},"较":{"docs":{},"为":{"docs":{},"简":{"docs":{},"单":{"docs":{},",":{"docs":{},"主":{"docs":{},"要":{"docs":{},"分":{"docs":{},"为":{"docs":{},"两":{"docs":{},"个":{"docs":{},"步":{"docs":{},"骤":{"docs":{},":":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}}}}}}}}}}}}},"默":{"docs":{},"认":{"docs":{},"情":{"docs":{},"况":{"docs":{},"下":{"docs":{},",":{"docs":{},"编":{"docs":{},"译":{"docs":{},"的":{"docs":{"preface/unix-linux-build/":{"ref":"preface/unix-linux-build/","tf":0.004629629629629629}}}}}}}}},"的":{"docs":{},"小":{"docs":{},"整":{"docs":{},"数":{"docs":{},"范":{"docs":{},"围":{"docs":{},"是":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}},"初":{"docs":{},"始":{"docs":{},"化":{"docs":{},"为":{"8":{"docs":{},"个":{"docs":{},"元":{"docs":{},"素":{"docs":{},",":{"docs":{},"通":{"docs":{},"过":{"docs":{},"t":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{},"e":{"docs":{},"指":{"docs":{},"向":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}},"docs":{}}}}}}},"&":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.00338409475465313},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0045691906005221935}},"&":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0025380710659898475},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0036330608537693005},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0045691906005221935}}},"v":{"docs":{},",":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425}}}},"l":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"_":{"docs":{},"a":{"docs":{},"s":{"docs":{},"_":{"docs":{},"n":{"docs":{},"u":{"docs":{},"m":{"docs":{},"b":{"docs":{},"e":{"docs":{},"r":{"docs":{},",":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}},"p":{"docs":{},"y":{"docs":{},"l":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"_":{"docs":{},"t":{"docs":{},"y":{"docs":{},"p":{"docs":{},"e":{"docs":{},")":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},";":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}},"d":{"docs":{},"i":{"docs":{},"c":{"docs":{},"t":{"docs":{},"_":{"docs":{},"t":{"docs":{},"y":{"docs":{},"p":{"docs":{},"e":{"docs":{},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}}}}}}}}}}}}}}},"=":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}}},"_":{"docs":{},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},"_":{"docs":{},"i":{"docs":{},"n":{"docs":{},"f":{"docs":{},"o":{"docs":{},"_":{"docs":{},"d":{"docs":{},"e":{"docs":{},"s":{"docs":{},"c":{"docs":{},")":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}},"o":{"docs":{},"b":{"docs":{},"a":{"docs":{},"s":{"docs":{},"e":{"docs":{},")":{"docs":{},")":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}},"l":{"docs":{},"d":{"docs":{},"_":{"docs":{},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"u":{"docs":{},"e":{"1":{"docs":{},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}},"docs":{},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}},"x":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}},"d":{"docs":{},"k":{"docs":{},"_":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"r":{"docs":{},"i":{"docs":{},"e":{"docs":{},"s":{"docs":{},"(":{"docs":{},"m":{"docs":{},"p":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}},"e":{"docs":{},"p":{"0":{"docs":{},"[":{"docs":{},"i":{"docs":{},"x":{"docs":{},"]":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}},"docs":{}}},"s":{"docs":{},"o":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}},"t":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{},"e":{"docs":{},"[":{"docs":{},"i":{"docs":{},"]":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}},"'":{"2":{"docs":{},"'":{"docs":{},"作":{"docs":{},"为":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"docs":{},"i":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425}}},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"d":{"docs":{},"'":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}},"%":{"docs":{},".":{"2":{"0":{"0":{"docs":{},"s":{"docs":{},"'":{"docs":{},"\"":{"docs":{},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"docs":{}},"docs":{}},"docs":{}}}},"(":{"0":{"docs":{},")":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}},"1":{"docs":{},")":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0032637075718015664}}}},"2":{"docs":{},")":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}},"3":{"docs":{},")":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}},"4":{"docs":{},")":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}},"5":{"docs":{},")":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}},"9":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}},"docs":{"objects/object/":{"ref":"objects/object/","tf":0.002886002886002886},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},"l":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"_":{"docs":{},"t":{"docs":{},"o":{"docs":{},"_":{"docs":{},"d":{"docs":{},"e":{"docs":{},"c":{"docs":{},"i":{"docs":{},"m":{"docs":{},"a":{"docs":{},"l":{"docs":{},"_":{"docs":{},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"_":{"docs":{},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"n":{"docs":{},"a":{"docs":{},"l":{"docs":{},"(":{"docs":{},"a":{"docs":{},"a":{"docs":{},",":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"_":{"docs":{},"a":{"docs":{},"s":{"docs":{},"s":{"docs":{},"_":{"docs":{},"s":{"docs":{},"l":{"docs":{},"i":{"docs":{},"c":{"docs":{},"e":{"docs":{},"(":{"docs":{},"s":{"docs":{},"e":{"docs":{},"l":{"docs":{},"f":{"docs":{},",":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}}}}}}},"r":{"docs":{},"e":{"docs":{},"s":{"docs":{},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},"(":{"docs":{},"s":{"docs":{},"e":{"docs":{},"l":{"docs":{},"f":{"docs":{},",":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}}}}}}}}}}}}}}}}}}},"(":{"docs":{},"p":{"docs":{},"y":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}}}}}}}}}}}},"a":{"docs":{},"s":{"docs":{},"c":{"docs":{},"i":{"docs":{},"i":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}}}}}}}}}}}}},"b":{"docs":{},"a":{"docs":{},"s":{"docs":{},"e":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}},"i":{"docs":{},"x":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"s":{"docs":{},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},"_":{"docs":{},"t":{"docs":{},")":{"docs":{},"s":{"docs":{},"o":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}},"*":{"docs":{},"b":{"docs":{},"i":{"docs":{},"n":{"docs":{},"a":{"docs":{},"r":{"docs":{},"y":{"docs":{},"f":{"docs":{},"u":{"docs":{},"n":{"docs":{},"c":{"docs":{},")":{"docs":{},"(":{"docs":{},"p":{"docs":{},"y":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}}}}}},"_":{"docs":{},"p":{"docs":{},"y":{"docs":{},"_":{"docs":{},"d":{"docs":{},"e":{"docs":{},"c":{"docs":{},"_":{"docs":{},"r":{"docs":{},"e":{"docs":{},"f":{"docs":{},"t":{"docs":{},"o":{"docs":{},"t":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}},"r":{"docs":{},"e":{"docs":{},"f":{"docs":{},"_":{"docs":{},"t":{"docs":{},"m":{"docs":{},"p":{"docs":{},")":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}},"l":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"_":{"docs":{},"o":{"docs":{},"n":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}},"z":{"docs":{},"e":{"docs":{},"r":{"docs":{},"o":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}},"d":{"docs":{},"i":{"docs":{},"c":{"docs":{},"t":{"docs":{},"_":{"docs":{},"h":{"docs":{},"a":{"docs":{},"s":{"docs":{},"s":{"docs":{},"p":{"docs":{},"l":{"docs":{},"i":{"docs":{},"t":{"docs":{},"t":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{},"e":{"docs":{},"(":{"docs":{},"m":{"docs":{},"p":{"docs":{},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}}}}}}}}},"a":{"docs":{},"b":{"docs":{},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{},"a":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}},"l":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}}}}}},"n":{"docs":{},"d":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"d":{"docs":{},"d":{"docs":{},")":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}}}},"b":{"docs":{},"i":{"docs":{},"n":{"docs":{},"a":{"docs":{},"r":{"docs":{},"y":{"docs":{},"f":{"docs":{},"u":{"docs":{},"n":{"docs":{},"c":{"docs":{},")":{"docs":{},"l":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"_":{"docs":{},"a":{"docs":{},"d":{"docs":{},"d":{"docs":{},",":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}},"m":{"docs":{},"u":{"docs":{},"l":{"docs":{},",":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}},"s":{"docs":{},"u":{"docs":{},"b":{"docs":{},",":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}},"r":{"docs":{},"s":{"docs":{},"h":{"docs":{},"i":{"docs":{},"f":{"docs":{},"t":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}}}}}}}}},"a":{"docs":{},"s":{"docs":{},"e":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"c":{"docs":{},"r":{"docs":{},"e":{"docs":{},"t":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}},"m":{"docs":{},"p":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0026109660574412533}}}}},"h":{"docs":{},"a":{"docs":{},"s":{"docs":{},"h":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0026109660574412533}},"f":{"docs":{},"u":{"docs":{},"n":{"docs":{},"c":{"docs":{},")":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}},"l":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"_":{"docs":{},"h":{"docs":{},"a":{"docs":{},"s":{"docs":{},"h":{"docs":{},",":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}}}}},"e":{"docs":{},"r":{"docs":{},"e":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}},"p":{"docs":{},"y":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0054869684499314125},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"n":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.002886002886002886}}}}}},"_":{"docs":{},"a":{"docs":{},"b":{"docs":{},"s":{"docs":{},"(":{"docs":{},"p":{"docs":{},"y":{"docs":{},"_":{"docs":{},"s":{"docs":{},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},"(":{"docs":{},"a":{"docs":{},")":{"docs":{},")":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}}}}}}}}}}}}}}}}},"t":{"docs":{},"y":{"docs":{},"p":{"docs":{},"e":{"docs":{},"(":{"docs":{},"m":{"docs":{},"p":{"docs":{},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}},"l":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},"*":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}}}}}}}}}}}},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"_":{"docs":{},"c":{"docs":{},"h":{"docs":{},"e":{"docs":{},"c":{"docs":{},"k":{"docs":{},"(":{"docs":{},"o":{"docs":{},"p":{"docs":{},")":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}}}}}},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{},"u":{"docs":{},"c":{"docs":{},"t":{"docs":{},"s":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"n":{"docs":{},"c":{"docs":{},"e":{"docs":{},"_":{"docs":{},"i":{"docs":{},"n":{"docs":{},"i":{"docs":{},"t":{"docs":{},"t":{"docs":{},"y":{"docs":{},"p":{"docs":{},"e":{"2":{"docs":{},"(":{"docs":{},"&":{"docs":{},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},"_":{"docs":{},"i":{"docs":{},"n":{"docs":{},"f":{"docs":{},"o":{"docs":{},"t":{"docs":{},"y":{"docs":{},"p":{"docs":{},"e":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}}},"docs":{}}}}}}}}}}}}}}}}}}}}}}},"e":{"docs":{},"t":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}},"d":{"docs":{},"i":{"docs":{},"c":{"docs":{},"t":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}},"i":{"docs":{},"n":{"docs":{},"d":{"docs":{},"e":{"docs":{},"x":{"docs":{},"_":{"docs":{},"c":{"docs":{},"h":{"docs":{},"e":{"docs":{},"c":{"docs":{},"k":{"docs":{},"(":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},")":{"docs":{},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}},"u":{"docs":{},"n":{"docs":{},"i":{"docs":{},"c":{"docs":{},"o":{"docs":{},"d":{"docs":{},"e":{"docs":{},"_":{"docs":{},"c":{"docs":{},"h":{"docs":{},"e":{"docs":{},"c":{"docs":{},"k":{"docs":{},"e":{"docs":{},"x":{"docs":{},"a":{"docs":{},"c":{"docs":{},"t":{"docs":{},"(":{"docs":{},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},")":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"o":{"docs":{},"p":{"docs":{},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"!":{"docs":{},"_":{"docs":{},"p":{"docs":{},"y":{"docs":{},"a":{"docs":{},"r":{"docs":{},"g":{"docs":{},"_":{"docs":{},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"u":{"docs":{},"p":{"docs":{},"l":{"docs":{},"e":{"docs":{},"a":{"docs":{},"n":{"docs":{},"d":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},"w":{"docs":{},"o":{"docs":{},"r":{"docs":{},"d":{"docs":{},"s":{"docs":{},"f":{"docs":{},"a":{"docs":{},"s":{"docs":{},"t":{"docs":{},"(":{"docs":{},"a":{"docs":{},"r":{"docs":{},"g":{"docs":{},"s":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"i":{"docs":{},"n":{"docs":{},"i":{"docs":{},"t":{"docs":{},"i":{"docs":{},"a":{"docs":{},"l":{"docs":{},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},"d":{"docs":{},")":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}}}},"p":{"docs":{},"y":{"docs":{},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"_":{"docs":{},"c":{"docs":{},"h":{"docs":{},"e":{"docs":{},"c":{"docs":{},"k":{"docs":{},"(":{"docs":{},"o":{"docs":{},"p":{"docs":{},")":{"docs":{},")":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.00411522633744856}}}}}}}}}}}}}}}}},"d":{"docs":{},"i":{"docs":{},"c":{"docs":{},"t":{"docs":{},"_":{"docs":{},"c":{"docs":{},"h":{"docs":{},"e":{"docs":{},"c":{"docs":{},"k":{"docs":{},"(":{"docs":{},"o":{"docs":{},"p":{"docs":{},")":{"docs":{},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}},"u":{"docs":{},"n":{"docs":{},"i":{"docs":{},"c":{"docs":{},"o":{"docs":{},"d":{"docs":{},"e":{"docs":{},"_":{"docs":{},"c":{"docs":{},"h":{"docs":{},"e":{"docs":{},"c":{"docs":{},"k":{"docs":{},"e":{"docs":{},"x":{"docs":{},"a":{"docs":{},"c":{"docs":{},"t":{"docs":{},"(":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}}}}}}},"f":{"docs":{},"r":{"docs":{},"o":{"docs":{},"z":{"docs":{},"e":{"docs":{},"n":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"_":{"docs":{},"c":{"docs":{},"h":{"docs":{},"e":{"docs":{},"c":{"docs":{},"k":{"docs":{},"(":{"docs":{},"a":{"docs":{},"n":{"docs":{},"y":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},")":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}}}}}}},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"_":{"docs":{},"c":{"docs":{},"h":{"docs":{},"e":{"docs":{},"c":{"docs":{},"k":{"docs":{},"(":{"docs":{},"a":{"docs":{},"n":{"docs":{},"y":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},")":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}}}},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}},";":{"docs":{},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}},"d":{"docs":{},"i":{"docs":{},"g":{"docs":{},"i":{"docs":{},"t":{"docs":{},")":{"docs":{},"a":{"docs":{},"b":{"docs":{},"s":{"docs":{},"(":{"docs":{},"i":{"docs":{},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},")":{"docs":{},")":{"docs":{},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0018165304268846503}}},"e":{"docs":{},"f":{"docs":{},"a":{"docs":{},"u":{"docs":{},"l":{"docs":{},"t":{"docs":{},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}},"k":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},"_":{"docs":{},"i":{"docs":{},"n":{"docs":{},"d":{"docs":{},"i":{"docs":{},"c":{"docs":{},"e":{"docs":{},"s":{"docs":{},")":{"docs":{},".":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},":":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}},"i":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0054869684499314125},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0032637075718015664}},"n":{"docs":{},"c":{"docs":{},"l":{"docs":{},"u":{"docs":{},"s":{"docs":{},"i":{"docs":{},"v":{"docs":{},"e":{"docs":{},")":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}},"q":{"docs":{},"u":{"docs":{},"i":{"docs":{},"r":{"docs":{},"y":{"docs":{},")":{"docs":{},"l":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"_":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"l":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}}},"t":{"8":{"docs":{},"_":{"docs":{},"t":{"docs":{},"*":{"docs":{},")":{"docs":{},"(":{"docs":{},"m":{"docs":{},"p":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}},"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},"_":{"docs":{},"i":{"docs":{},"n":{"docs":{},"f":{"docs":{},"o":{"docs":{},"t":{"docs":{},"y":{"docs":{},"p":{"docs":{},"e":{"docs":{},".":{"docs":{},"t":{"docs":{},"p":{"docs":{},"_":{"docs":{},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}}}},"d":{"docs":{},"e":{"docs":{},"x":{"docs":{},"e":{"docs":{},"r":{"docs":{},"r":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}}}}}}}},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"_":{"docs":{},"r":{"docs":{},"e":{"docs":{},"s":{"docs":{},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},"(":{"docs":{},"m":{"docs":{},"p":{"docs":{},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}}}}}}}}}}}}}}}}}}}}},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}},"t":{"docs":{},"e":{"docs":{},"m":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}},"r":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}},"*":{"5":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},"docs":{}},"x":{"1":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0018165304268846503}}},"s":{"docs":{},"_":{"docs":{},"o":{"docs":{},"l":{"docs":{},"d":{"docs":{},"t":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{},"e":{"docs":{},"_":{"docs":{},"m":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{},"e":{"docs":{},"d":{"docs":{},")":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}}}}},"n":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}},"o":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}},"n":{"docs":{},"e":{"docs":{},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}},"e":{"docs":{},"w":{"docs":{},"i":{"docs":{},"t":{"docs":{},"e":{"docs":{},"m":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}},"s":{"docs":{},"i":{"docs":{},"z":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.006858710562414266},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}}},"t":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}}}}}},"u":{"docs":{},"m":{"docs":{},"f":{"docs":{},"r":{"docs":{},"e":{"docs":{},"e":{"docs":{},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}},"o":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0013623978201634877}},"b":{"docs":{},"a":{"docs":{},"s":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}}}}},"p":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}},"a":{"docs":{},"r":{"docs":{},"g":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}},"c":{"docs":{},"o":{"docs":{},"d":{"docs":{},"e":{"docs":{},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}}}}}}}},"l":{"docs":{},"d":{"docs":{},"_":{"docs":{},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"u":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}},"s":{"docs":{},"i":{"docs":{},"g":{"docs":{},"n":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}},"z":{"docs":{},"e":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}},"_":{"docs":{},"a":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}}},"t":{"docs":{},")":{"docs":{},"n":{"docs":{},"e":{"docs":{},"w":{"docs":{},"s":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}}}}}},"p":{"docs":{},"y":{"docs":{},"_":{"docs":{},"s":{"docs":{},"s":{"docs":{},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},"_":{"docs":{},"t":{"docs":{},"_":{"docs":{},"m":{"docs":{},"a":{"docs":{},"x":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}}}}}},"h":{"docs":{},"a":{"docs":{},"s":{"docs":{},"h":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"s":{"docs":{},"o":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}},"e":{"docs":{},"e":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},"t":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"_":{"docs":{},"a":{"docs":{},")":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0039164490861618795}}}},"u":{"docs":{},"p":{"docs":{},"d":{"docs":{},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"_":{"docs":{},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"n":{"docs":{},"a":{"docs":{},"l":{"docs":{},"(":{"docs":{},"s":{"docs":{},"o":{"docs":{},",":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}}}}}},"o":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0019582245430809398}}},"t":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}}}}}}}},"t":{"docs":{},"y":{"docs":{},"p":{"docs":{},"e":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}},"u":{"docs":{},"n":{"docs":{},"a":{"docs":{},"r":{"docs":{},"y":{"docs":{},"f":{"docs":{},"u":{"docs":{},"n":{"docs":{},"c":{"docs":{},")":{"docs":{},"l":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"_":{"docs":{},"a":{"docs":{},"b":{"docs":{},"s":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}},"i":{"docs":{},"n":{"docs":{},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{},"t":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}},"l":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}},"n":{"docs":{},"e":{"docs":{},"g":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}}}},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},")":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}},"p":{"docs":{},"d":{"docs":{},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},")":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}},"v":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}},"o":{"docs":{},"i":{"docs":{},"d":{"docs":{},")":{"docs":{},"p":{"docs":{},"y":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},"_":{"docs":{},"i":{"docs":{},"n":{"docs":{},"i":{"docs":{},"t":{"docs":{},"(":{"docs":{},"v":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}}}}}}}},"x":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},"_":{"docs":{},"a":{"docs":{},"d":{"docs":{},"d":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}},"z":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}},"'":{"1":{"docs":{},"'":{"docs":{},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0013623978201634877}}}}},"2":{"docs":{},"'":{"docs":{},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}},"docs":{},"e":{"docs":{},"'":{"docs":{},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"e":{"docs":{},"p":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}}},"r":{"docs":{},"r":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}},"n":{"docs":{},"t":{"docs":{},"r":{"docs":{},"i":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.007180156657963447}}}}}}},"j":{"docs":{},"=":{"0":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"docs":{}}},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},"_":{"docs":{},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"u":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}},"m":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},"a":{"docs":{},"p":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"i":{"docs":{},"n":{"docs":{},"u":{"docs":{},"s":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"p":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.002270663033605813}}}},"w":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},"f":{"docs":{},"r":{"docs":{},"e":{"docs":{},"e":{"docs":{},"s":{"docs":{},"l":{"docs":{},"o":{"docs":{},"t":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}},"r":{"docs":{},"e":{"docs":{},"m":{"docs":{},"o":{"docs":{},"v":{"docs":{},"e":{"docs":{},")":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}},"v":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}},"*":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425},"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/long-object/":{"ref":"objects/long-object/","tf":0.009306260575296108},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0205761316872428},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.005449591280653951},"objects/set-object/":{"ref":"objects/set-object/","tf":0.007180156657963447}},"a":{"docs":{},"a":{"docs":{},")":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425}}},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.00338409475465313}}},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}},"r":{"docs":{},"g":{"docs":{},"s":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}},"n":{"docs":{},"y":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},",":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}},"f":{"docs":{},"p":{"docs":{},",":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425}}}},"r":{"docs":{},"e":{"docs":{},"e":{"docs":{},"_":{"docs":{},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"[":{"docs":{},"p":{"docs":{},"y":{"docs":{},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"_":{"docs":{},"m":{"docs":{},"a":{"docs":{},"x":{"docs":{},"f":{"docs":{},"r":{"docs":{},"e":{"docs":{},"e":{"docs":{},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"]":{"docs":{},";":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}}}}}}}}}}}}}}}}}},"s":{"docs":{},"l":{"docs":{},"o":{"docs":{},"t":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}},"o":{"docs":{},"p":{"docs":{},",":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0054869684499314125},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},";":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}},"b":{"docs":{},"_":{"docs":{},"t":{"docs":{},"y":{"docs":{},"p":{"docs":{},"e":{"docs":{},";":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.002886002886002886}}},",":{"docs":{},"它":{"docs":{},"指":{"docs":{},"向":{"docs":{},"的":{"docs":{},"类":{"docs":{},"型":{"docs":{},"对":{"docs":{},"象":{"docs":{},"就":{"docs":{},"决":{"docs":{},"定":{"docs":{},"了":{"docs":{},"一":{"docs":{},"个":{"docs":{},"对":{"docs":{},"象":{"docs":{},"是":{"docs":{},"什":{"docs":{},"么":{"docs":{},"类":{"docs":{},"型":{"docs":{},"的":{"docs":{},"。":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"a":{"docs":{},"s":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},"e":{"docs":{},")":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},"l":{"docs":{},"d":{"docs":{},"_":{"docs":{},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"u":{"docs":{},"e":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}},"t":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{},"e":{"docs":{},",":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}}}}}}},"c":{"docs":{},"r":{"docs":{},"a":{"docs":{},"t":{"docs":{},"c":{"docs":{},"h":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}},"e":{"docs":{},"l":{"docs":{},"f":{"docs":{},",":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0054869684499314125}}}}},"t":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}},"u":{"docs":{},"b":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"o":{"docs":{},",":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0039164490861618795}}},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}},"v":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},";":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425},"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}}},")":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}}},"a":{"docs":{},"l":{"docs":{},"u":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},"e":{"docs":{},")":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0013623978201634877}}},"_":{"docs":{},"a":{"docs":{},"d":{"docs":{},"d":{"docs":{},"r":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}}}}}}}}}}},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},")":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}},"(":{"docs":{},"o":{"docs":{},"p":{"docs":{},")":{"docs":{},")":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}},";":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}},";":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}},"a":{"docs":{},"a":{"docs":{},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}},"n":{"docs":{},"y":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},",":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}},")":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}},";":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}},"n":{"docs":{},"u":{"docs":{},"l":{"docs":{},"l":{"docs":{},")":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}},"o":{"docs":{},"p":{"docs":{},")":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}}},",":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}}},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}},"m":{"docs":{},"p":{"docs":{},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}}},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}},"s":{"docs":{},"o":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}},"t":{"docs":{},"y":{"docs":{},"p":{"docs":{},"e":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}},",":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}},"/":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.04040404040404041},"objects/long-object/":{"ref":"objects/long-object/","tf":0.06937394247038917},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0054869684499314125},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.009082652134423252},"objects/set-object/":{"ref":"objects/set-object/","tf":0.01174934725848564}}},"_":{"docs":{},"o":{"docs":{},"b":{"docs":{},"_":{"docs":{},"n":{"docs":{},"e":{"docs":{},"x":{"docs":{},"t":{"docs":{},";":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}},"p":{"docs":{},"r":{"docs":{},"e":{"docs":{},"v":{"docs":{},";":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}},"p":{"docs":{},"y":{"docs":{},"_":{"docs":{},"d":{"docs":{},"e":{"docs":{},"c":{"docs":{},"r":{"docs":{},"e":{"docs":{},"f":{"docs":{},"_":{"docs":{},"t":{"docs":{},"m":{"docs":{},"p":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}},"l":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}},"t":{"docs":{},"p":{"docs":{},"_":{"docs":{},"a":{"docs":{},"s":{"docs":{},"_":{"docs":{},"a":{"docs":{},"s":{"docs":{},"y":{"docs":{},"n":{"docs":{},"c":{"docs":{},";":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}},"m":{"docs":{},"a":{"docs":{},"p":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}},"p":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},";":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}},"的":{"docs":{},"分":{"docs":{},"析":{"docs":{},"与":{"docs":{},"p":{"docs":{},"y":{"docs":{},"n":{"docs":{},"u":{"docs":{},"m":{"docs":{},"b":{"docs":{},"e":{"docs":{},"r":{"docs":{},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"d":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}}}}}}}}}},"n":{"docs":{},"u":{"docs":{},"m":{"docs":{},"b":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.002886002886002886}},"e":{"docs":{},"r":{"docs":{},";":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}},"s":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.002886002886002886}},"e":{"docs":{},"n":{"docs":{},"c":{"docs":{},"e":{"docs":{},";":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{},";":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}},"e":{"docs":{},"m":{"docs":{},"p":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}},"y":{"docs":{},"p":{"docs":{},"e":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0025380710659898475},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{},"e":{"docs":{},",":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}}}}},"m":{"docs":{},"p":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}},"*":{"docs":{},"b":{"docs":{},"y":{"docs":{},"t":{"docs":{},"e":{"docs":{},"s":{"docs":{},"_":{"docs":{},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{},")":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}},"p":{"docs":{},"_":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"p":{"docs":{},"u":{"docs":{},"t":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}},";":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}},")":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}},"p":{"docs":{},"y":{"docs":{},"m":{"docs":{},"e":{"docs":{},"m":{"docs":{},"_":{"docs":{},"r":{"docs":{},"e":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{},"(":{"docs":{},"s":{"docs":{},"e":{"docs":{},"l":{"docs":{},"f":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}}}}}}}}}}},"i":{"docs":{},"t":{"docs":{},"e":{"docs":{},"m":{"docs":{},"s":{"docs":{},";":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}}}}}}}},"o":{"docs":{},"b":{"docs":{},"_":{"docs":{},"i":{"docs":{},"t":{"docs":{},"e":{"docs":{},"m":{"docs":{},";":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}},"c":{"docs":{},"a":{"docs":{},"n":{"docs":{},"*":{"docs":{},"*":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"m":{"docs":{},"a":{"docs":{},"_":{"docs":{},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"u":{"docs":{},"e":{"docs":{},"_":{"docs":{},"a":{"docs":{},"d":{"docs":{},"d":{"docs":{},"r":{"docs":{},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}},"s":{"docs":{},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}},"b":{"docs":{},")":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.00338409475465313}}},"y":{"docs":{},"t":{"docs":{},"e":{"docs":{},"s":{"docs":{},"_":{"docs":{},"w":{"docs":{},"r":{"docs":{},"i":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}},"k":{"docs":{},"w":{"docs":{},"a":{"docs":{},"r":{"docs":{},"g":{"docs":{},"s":{"docs":{},")":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}},"e":{"docs":{},"y":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0018165304268846503},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0019582245430809398}}},"s":{"docs":{},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},")":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0026109660574412533}}},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}},"p":{"docs":{},"i":{"docs":{},"n":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}},"r":{"docs":{},"e":{"docs":{},"t":{"docs":{},"u":{"docs":{},"r":{"docs":{},"n":{"docs":{},"_":{"docs":{},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"u":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}},"w":{"docs":{},"r":{"docs":{},"i":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},"e":{"docs":{},"a":{"docs":{},"k":{"docs":{},"r":{"docs":{},"e":{"docs":{},"f":{"docs":{},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}},"x":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}}}},"z":{"docs":{},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.00338409475465313}}}},"n":{"docs":{},"e":{"docs":{},"w":{"docs":{},"i":{"docs":{},"t":{"docs":{},"e":{"docs":{},"m":{"docs":{},")":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.00411522633744856}}}}}}},"_":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},"s":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},"_":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},"(":{"docs":{},"p":{"docs":{},"y":{"docs":{},"_":{"docs":{},"s":{"docs":{},"s":{"docs":{},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},"_":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}}}}}},"t":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{},"e":{"docs":{},",":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}},"c":{"docs":{},"e":{"docs":{},"s":{"docs":{},"s":{"docs":{},"a":{"docs":{},"r":{"docs":{},"y":{"docs":{},"*":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}},"d":{"docs":{},"k":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}},"e":{"docs":{},"p":{"0":{"1":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"n":{"docs":{},"t":{"docs":{},"r":{"docs":{},"y":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0026109660574412533}}}}}}}},"i":{"docs":{},"n":{"docs":{},"d":{"docs":{},"i":{"docs":{},"c":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"t":{"docs":{},"e":{"docs":{},"m":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"r":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{},"e":{"docs":{},")":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}}}}}}}}},"m":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},"a":{"docs":{},"_":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},"s":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}},"p":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"e":{"docs":{},"_":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"u":{"docs":{},"e":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}},"p":{"docs":{},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0013623978201634877}}},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}}}}}},"=":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425},"objects/object/":{"ref":"objects/object/","tf":0.015873015873015872},"objects/long-object/":{"ref":"objects/long-object/","tf":0.04230118443316413},"objects/list-object/":{"ref":"objects/list-object/","tf":0.04801097393689986},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.033151680290644865},"objects/set-object/":{"ref":"objects/set-object/","tf":0.044386422976501305}},"=":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425},"objects/long-object/":{"ref":"objects/long-object/","tf":0.009306260575296108},"objects/list-object/":{"ref":"objects/list-object/","tf":0.013717421124828532},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.01044504995458674},"objects/set-object/":{"ref":"objects/set-object/","tf":0.01762402088772846}}}},"}":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425},"objects/object/":{"ref":"objects/object/","tf":0.010101010101010102},"objects/long-object/":{"ref":"objects/long-object/","tf":0.016074450084602367},"objects/list-object/":{"ref":"objects/list-object/","tf":0.03155006858710562},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.018619436875567667},"objects/set-object/":{"ref":"objects/set-object/","tf":0.024804177545691905}},",":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}},";":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.008658008658008658},"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}}}},"函":{"docs":{},"数":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}},"实":{"docs":{},"现":{"docs":{},"中":{"docs":{},"的":{"docs":{},"前":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425}}}}}}},"的":{"docs":{},"指":{"docs":{},"针":{"docs":{},"是":{"docs":{},"一":{"docs":{},"个":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}},"执":{"docs":{},"行":{"docs":{},"流":{"docs":{},"程":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}},"过":{"docs":{},"程":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}},"可":{"docs":{},"以":{"docs":{},"看":{"docs":{},"出":{"docs":{},"有":{"docs":{},"如":{"docs":{},"下":{"docs":{},"几":{"docs":{},"种":{"docs":{},"情":{"docs":{},"况":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}},"是":{"docs":{},"一":{"docs":{},"种":{"docs":{},"快":{"docs":{},"速":{"docs":{},"乘":{"docs":{},"法":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}},"调":{"docs":{},"整":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"_":{"docs":{},"r":{"docs":{},"e":{"docs":{},"s":{"docs":{},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},"就":{"docs":{},"是":{"docs":{},"用":{"docs":{},"于":{"docs":{},"调":{"docs":{},"节":{"docs":{},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"存":{"docs":{},"储":{"docs":{},"空":{"docs":{},"间":{"docs":{},"大":{"docs":{},"小":{"docs":{},"的":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"进":{"docs":{},"行":{"docs":{},"处":{"docs":{},"理":{"docs":{},"设":{"docs":{},"置":{"docs":{},"值":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}},"将":{"docs":{},"值":{"docs":{},"加":{"docs":{},"入":{"docs":{},"到":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}},"来":{"docs":{},"实":{"docs":{},"现":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}},"则":{"docs":{},"将":{"docs":{},"转":{"docs":{},"换":{"docs":{},"好":{"docs":{},"的":{"docs":{},"字":{"docs":{},"符":{"docs":{},"串":{"docs":{},"对":{"docs":{},"象":{"docs":{},"打":{"docs":{},"印":{"docs":{},"至":{"docs":{},"我":{"docs":{},"们":{"docs":{},"指":{"docs":{},"定":{"docs":{},"的":{"docs":{},"标":{"docs":{},"准":{"docs":{},"输":{"docs":{},"出":{"docs":{},"(":{"docs":{},"s":{"docs":{},"t":{"docs":{},"d":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},")":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"该":{"docs":{},"类":{"docs":{},"型":{"docs":{},"对":{"docs":{},"象":{"docs":{},"不":{"docs":{},"支":{"docs":{},"持":{"docs":{},"设":{"docs":{},"置":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}},"什":{"docs":{},"么":{"docs":{},"也":{"docs":{},"不":{"docs":{},"做":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}},"直":{"docs":{},"接":{"docs":{},"返":{"docs":{},"回":{"docs":{},",":{"docs":{},"如":{"docs":{},"果":{"docs":{},"能":{"docs":{},"被":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}},"继":{"docs":{},"续":{"docs":{},"调":{"docs":{},"用":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}},"设":{"docs":{},"置":{"docs":{},"f":{"docs":{},"r":{"docs":{},"e":{"docs":{},"e":{"docs":{},"s":{"docs":{},"l":{"docs":{},"o":{"docs":{},"t":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}},"调":{"docs":{},"用":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}},"重":{"docs":{},"新":{"docs":{},"扩":{"docs":{},"充":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}},"比":{"docs":{},"如":{"docs":{},",":{"docs":{},"我":{"docs":{},"们":{"docs":{},"希":{"docs":{},"望":{"docs":{},"在":{"docs":{},"解":{"docs":{},"释":{"docs":{},"器":{"docs":{},"交":{"docs":{},"互":{"docs":{},"界":{"docs":{},"面":{"docs":{},"中":{"docs":{},"打":{"docs":{},"印":{"docs":{},"整":{"docs":{},"数":{"docs":{},"值":{"docs":{},"的":{"docs":{},"时":{"docs":{},"候":{"docs":{},"输":{"docs":{},"出":{"docs":{},"一":{"docs":{},"段":{"docs":{},"字":{"docs":{},"符":{"docs":{},"串":{"docs":{},",":{"docs":{},"则":{"docs":{},"我":{"docs":{},"们":{"docs":{},"可":{"docs":{},"以":{"docs":{},"修":{"docs":{},"改":{"docs":{},"如":{"docs":{},"下":{"docs":{},"函":{"docs":{},"数":{"docs":{},":":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"用":{"docs":{},"于":{"docs":{},"把":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425}}}}},"行":{"docs":{},"为":{"docs":{},"我":{"docs":{},"们":{"docs":{},"加":{"docs":{},"入":{"docs":{},"的":{"docs":{},"代":{"docs":{},"码":{"docs":{},",":{"docs":{},"其":{"docs":{},"中":{"docs":{},":":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425}}}}}}}}}}}}}},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"这":{"docs":{},"就":{"docs":{},"需":{"docs":{},"要":{"docs":{},"借":{"docs":{},"助":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425}}}}}}},"两":{"docs":{},"个":{"docs":{},"宏":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}},"种":{"docs":{},"类":{"docs":{},"型":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}},"些":{"docs":{},"宏":{"docs":{},"在":{"docs":{},"各":{"docs":{},"种":{"docs":{},"内":{"docs":{},"建":{"docs":{},"类":{"docs":{},"型":{"docs":{},"对":{"docs":{},"象":{"docs":{},"的":{"docs":{},"初":{"docs":{},"始":{"docs":{},"化":{"docs":{},"中":{"docs":{},"被":{"docs":{},"大":{"docs":{},"量":{"docs":{},"使":{"docs":{},"用":{"docs":{},"。":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}}}}}}},"是":{"docs":{},"一":{"docs":{},"个":{"docs":{},"非":{"docs":{},"常":{"docs":{},"重":{"docs":{},"要":{"docs":{},"的":{"docs":{},"结":{"docs":{},"构":{"docs":{},"体":{"docs":{},",":{"docs":{},"它":{"docs":{},"不":{"docs":{},"仅":{"docs":{},"仅":{"docs":{},"决":{"docs":{},"定":{"docs":{},"了":{"docs":{},"一":{"docs":{},"个":{"docs":{},"对":{"docs":{},"象":{"docs":{},"的":{"docs":{},"类":{"docs":{},"型":{"docs":{},",":{"docs":{},"还":{"docs":{},"包":{"docs":{},"含":{"docs":{},"大":{"docs":{},"量":{"docs":{},"的":{"docs":{},"元":{"docs":{},"信":{"docs":{},"息":{"docs":{},",":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"样":{"docs":{},"的":{"docs":{},"函":{"docs":{},"数":{"docs":{},"指":{"docs":{},"针":{"docs":{},")":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}},"处":{"docs":{},"理":{"docs":{},"之":{"docs":{},"后":{"docs":{},",":{"docs":{},"简":{"docs":{},"化":{"docs":{},"为":{"docs":{},"做":{"docs":{},"三":{"docs":{},"次":{"docs":{},"乘":{"docs":{},"法":{"docs":{},",":{"docs":{},"并":{"docs":{},"附":{"docs":{},"带":{"docs":{},"少":{"docs":{},"量":{"docs":{},"的":{"docs":{},"加":{"docs":{},"法":{"docs":{},"操":{"docs":{},"作":{"docs":{},"和":{"docs":{},"移":{"docs":{},"位":{"docs":{},"操":{"docs":{},"作":{"docs":{},"。":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"类":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.002886002886002886}}},"里":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}},"重":{"docs":{},"新":{"docs":{},"进":{"docs":{},"行":{"docs":{},"编":{"docs":{},"译":{"docs":{},",":{"docs":{},"在":{"docs":{"preface/modify-code/":{"ref":"preface/modify-code/","tf":0.010638297872340425}}}}}}}},"改":{"docs":{},"变":{"docs":{},"大":{"docs":{},"小":{"docs":{},",":{"docs":{},"它":{"docs":{},"会":{"docs":{},"立":{"docs":{},"马":{"docs":{},"改":{"docs":{},"变":{"docs":{},"为":{"docs":{},"一":{"docs":{},"个":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}},"插":{"docs":{},"入":{"docs":{},"该":{"docs":{},"列":{"docs":{},"表":{"docs":{},"该":{"docs":{},"值":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}},"置":{"docs":{},"t":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{},"e":{"docs":{},"指":{"docs":{},"向":{"docs":{},"新":{"docs":{},"t":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}},"!":{"docs":{},"=":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/long-object/":{"ref":"objects/long-object/","tf":0.00338409475465313},"objects/list-object/":{"ref":"objects/list-object/","tf":0.00411522633744856},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.004541326067211626},"objects/set-object/":{"ref":"objects/set-object/","tf":0.008485639686684074}}},"p":{"docs":{},"y":{"docs":{},"u":{"docs":{},"n":{"docs":{},"i":{"docs":{},"c":{"docs":{},"o":{"docs":{},"d":{"docs":{},"e":{"docs":{},"_":{"docs":{},"c":{"docs":{},"h":{"docs":{},"e":{"docs":{},"c":{"docs":{},"k":{"docs":{},"e":{"docs":{},"x":{"docs":{},"a":{"docs":{},"c":{"docs":{},"t":{"docs":{},"(":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},")":{"docs":{},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"\"":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},".":{"docs":{},"\"":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},"\"":{"docs":{},",":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.004329004329004329},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}},"(":{"docs":{},")":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}}}},"e":{"docs":{},"g":{"docs":{},"e":{"docs":{},"r":{"docs":{},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{},"\"":{"docs":{},",":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}},"t":{"docs":{},"y":{"docs":{},"p":{"docs":{},"e":{"docs":{},"\"":{"docs":{},",":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}},"b":{"docs":{},"a":{"docs":{},"s":{"docs":{},"e":{"docs":{},"\"":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}},"\"":{"docs":{},"\"":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}}}},"c":{"docs":{},"a":{"docs":{},"n":{"docs":{},"n":{"docs":{},"o":{"docs":{},"t":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}}}}}}},"o":{"docs":{},"m":{"docs":{},"b":{"docs":{},"i":{"docs":{},"n":{"docs":{},"e":{"docs":{},"d":{"docs":{},"\"":{"docs":{},":":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}},"p":{"docs":{},"y":{"docs":{},"r":{"docs":{},"i":{"docs":{},"g":{"docs":{},"h":{"docs":{},"t":{"docs":{},"\"":{"docs":{},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}},"r":{"docs":{},"e":{"docs":{},"d":{"docs":{},"i":{"docs":{},"t":{"docs":{},"s":{"docs":{},"\"":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}}}},"c":{"docs":{},"e":{"docs":{},"n":{"docs":{},"s":{"docs":{},"e":{"docs":{},"\"":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0013623978201634877}}},"h":{"docs":{},"e":{"docs":{},"l":{"docs":{},"p":{"docs":{},"\"":{"docs":{},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}},"#":{"2":{"2":{"6":{"5":{"3":{"docs":{},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"docs":{}},"docs":{}},"docs":{}},"docs":{}},"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/list-object/":{"ref":"objects/list-object/","tf":0.00411522633744856}},"d":{"docs":{},"e":{"docs":{},"f":{"docs":{},"i":{"docs":{},"n":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.011544011544011544},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0025380710659898475},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}},"e":{"docs":{},"l":{"docs":{},"s":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}},"n":{"docs":{},"d":{"docs":{},"i":{"docs":{},"f":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/long-object/":{"ref":"objects/long-object/","tf":0.004230118443316413},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}}}}}}},"i":{"docs":{},"f":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}},"d":{"docs":{},"e":{"docs":{},"f":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}},"n":{"docs":{},"d":{"docs":{},"e":{"docs":{},"f":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}},"\\":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.024531024531024532},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}},"_":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.005772005772005772}}}}}}}},"p":{"docs":{},"y":{"docs":{},"_":{"docs":{},"c":{"docs":{},"h":{"docs":{},"e":{"docs":{},"c":{"docs":{},"k":{"docs":{},"_":{"docs":{},"r":{"docs":{},"e":{"docs":{},"f":{"docs":{},"c":{"docs":{},"n":{"docs":{},"t":{"docs":{},"(":{"docs":{},"_":{"docs":{},"p":{"docs":{},"y":{"docs":{},"_":{"docs":{},"d":{"docs":{},"e":{"docs":{},"c":{"docs":{},"r":{"docs":{},"e":{"docs":{},"f":{"docs":{},"_":{"docs":{},"t":{"docs":{},"m":{"docs":{},"p":{"docs":{},")":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"o":{"docs":{},"u":{"docs":{},"n":{"docs":{},"t":{"docs":{},"_":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{},"s":{"docs":{},"_":{"docs":{},"c":{"docs":{},"o":{"docs":{},"m":{"docs":{},"m":{"docs":{},"a":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}}},"d":{"docs":{},"e":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{},"(":{"docs":{},"_":{"docs":{},"p":{"docs":{},"y":{"docs":{},"_":{"docs":{},"d":{"docs":{},"e":{"docs":{},"c":{"docs":{},"r":{"docs":{},"e":{"docs":{},"f":{"docs":{},"_":{"docs":{},"t":{"docs":{},"m":{"docs":{},"p":{"docs":{},")":{"docs":{},";":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}}}}}}}}},"i":{"docs":{},"n":{"docs":{},"c":{"docs":{},"_":{"docs":{},"r":{"docs":{},"e":{"docs":{},"f":{"docs":{},"t":{"docs":{},"o":{"docs":{},"t":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.002886002886002886}}}}}}}},"t":{"docs":{},"p":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{},"s":{"docs":{},"(":{"docs":{},"o":{"docs":{},"p":{"docs":{},")":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}},"n":{"docs":{},"e":{"docs":{},"w":{"docs":{},"r":{"docs":{},"e":{"docs":{},"f":{"docs":{},"e":{"docs":{},"r":{"docs":{},"e":{"docs":{},"n":{"docs":{},"c":{"docs":{},"e":{"docs":{},"(":{"docs":{},"o":{"docs":{},"p":{"docs":{},")":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}},"(":{"docs":{},"p":{"docs":{},"y":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}}}}},"r":{"docs":{},"e":{"docs":{},"f":{"docs":{},"_":{"docs":{},"d":{"docs":{},"e":{"docs":{},"b":{"docs":{},"u":{"docs":{},"g":{"docs":{},"_":{"docs":{},"c":{"docs":{},"o":{"docs":{},"m":{"docs":{},"m":{"docs":{},"a":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.004329004329004329}}}}}}}}}}}}}}}}},"h":{"docs":{},"o":{"docs":{},"t":{"docs":{},"_":{"docs":{},"f":{"docs":{},"u":{"docs":{},"n":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},"_":{"docs":{},"e":{"docs":{},"x":{"docs":{},"t":{"docs":{},"r":{"docs":{},"a":{"docs":{},"_":{"docs":{},"i":{"docs":{},"n":{"docs":{},"i":{"docs":{},"t":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.004329004329004329}}}}}}}}}}}},"h":{"docs":{},"e":{"docs":{},"a":{"docs":{},"d":{"docs":{},"_":{"docs":{},"e":{"docs":{},"x":{"docs":{},"t":{"docs":{},"r":{"docs":{},"a":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.004329004329004329}}}}}}}}}}}},"g":{"docs":{},"c":{"docs":{},"_":{"docs":{},"t":{"docs":{},"r":{"docs":{},"a":{"docs":{},"c":{"docs":{},"k":{"docs":{},"(":{"docs":{},"o":{"docs":{},"p":{"docs":{},")":{"docs":{},";":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}}}}}}}}}}}},"a":{"docs":{},"r":{"docs":{},"g":{"docs":{},"_":{"docs":{},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"s":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}},"b":{"docs":{},"y":{"docs":{},"t":{"docs":{},"e":{"docs":{},"s":{"docs":{},"w":{"docs":{},"r":{"docs":{},"i":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}},"l":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"_":{"docs":{},"i":{"docs":{},"n":{"docs":{},"i":{"docs":{},"t":{"docs":{},"(":{"docs":{},"v":{"docs":{},"o":{"docs":{},"i":{"docs":{},"d":{"docs":{},")":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}},"n":{"docs":{},"e":{"docs":{},"w":{"docs":{},"(":{"docs":{},"s":{"docs":{},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},"_":{"docs":{},"a":{"docs":{},")":{"docs":{},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}},"o":{"docs":{},"n":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}},"z":{"docs":{},"e":{"docs":{},"r":{"docs":{},"o":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}},"u":{"docs":{},"n":{"docs":{},"i":{"docs":{},"c":{"docs":{},"o":{"docs":{},"d":{"docs":{},"e":{"docs":{},"w":{"docs":{},"r":{"docs":{},"i":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}},"_":{"docs":{},"e":{"docs":{},"q":{"docs":{},"(":{"docs":{},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},",":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}}}}}}}}}}}}}}}}}}}},"d":{"docs":{},"i":{"docs":{},"c":{"docs":{},"t":{"docs":{},"_":{"docs":{},"n":{"docs":{},"e":{"docs":{},"w":{"docs":{},"p":{"docs":{},"r":{"docs":{},"e":{"docs":{},"s":{"docs":{},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},"d":{"docs":{},"(":{"docs":{},"(":{"docs":{},"p":{"docs":{},"y":{"docs":{},"_":{"docs":{},"s":{"docs":{},"s":{"docs":{},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},"_":{"docs":{},"t":{"docs":{},")":{"docs":{},"o":{"docs":{},"p":{"docs":{},"a":{"docs":{},"r":{"docs":{},"g":{"docs":{},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}},"p":{"docs":{},"y":{"docs":{},"_":{"docs":{},"s":{"docs":{},"s":{"docs":{},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},"_":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"a":{"docs":{},"r":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}},"t":{"docs":{},"y":{"docs":{},"p":{"docs":{},"e":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.005772005772005772}},"代":{"docs":{},"码":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},"w":{"docs":{},"o":{"docs":{},"r":{"docs":{},"d":{"docs":{},"s":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}},"[":{"docs":{},"]":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}},"l":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}},"_":{"docs":{},"e":{"docs":{},"q":{"docs":{},"_":{"docs":{},"_":{"docs":{},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}},"d":{"docs":{},"i":{"docs":{},"c":{"docs":{},"t":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},"s":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}}}}}}}}}}}}}}}}},"k":{"docs":{},"n":{"docs":{},"o":{"docs":{},"w":{"docs":{},"n":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"_":{"docs":{},"m":{"docs":{},"u":{"docs":{},"l":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}},"a":{"docs":{},"r":{"docs":{},"a":{"docs":{},"t":{"docs":{},"s":{"docs":{},"u":{"docs":{},"b":{"docs":{},"a":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}}}}}}}}}},"e":{"docs":{},"e":{"docs":{},"p":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}}}},"y":{"1":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.021798365122615803},"objects/set-object/":{"ref":"objects/set-object/","tf":0.005221932114882507}},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0026109660574412533}},")":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}},")":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.004087193460490463},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0032637075718015664}},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"u":{"docs":{},"e":{"docs":{},",":{"docs":{},"每":{"docs":{},"一":{"docs":{},"个":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0019582245430809398}}},"_":{"docs":{},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"u":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},"e":{"docs":{},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}},"s":{"docs":{},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}}},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},"_":{"docs":{},"f":{"docs":{},"r":{"docs":{},"e":{"docs":{},"e":{"docs":{},"_":{"docs":{},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"[":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}},"。":{"docs":{},"当":{"docs":{},"出":{"docs":{},"现":{"docs":{},"一":{"docs":{},"个":{"docs":{},"事":{"docs":{},"件":{"docs":{},"将":{"docs":{},"字":{"docs":{},"典":{"docs":{},"的":{"docs":{},"属":{"docs":{},"性":{"docs":{},"值":{"docs":{},"进":{"docs":{},"行":{"docs":{},"改":{"docs":{},"变":{"docs":{},"的":{"docs":{},"时":{"docs":{},"候":{"docs":{},",":{"docs":{},"个":{"docs":{},"别":{"docs":{},"字":{"docs":{},"典":{"docs":{},"将":{"docs":{},"慢":{"docs":{},"慢":{"docs":{},"的":{"docs":{},"转":{"docs":{},"化":{"docs":{},"成":{"docs":{},"组":{"docs":{},"合":{"docs":{},"表":{"docs":{},"的":{"docs":{},"形":{"docs":{},"式":{"docs":{},"。":{"docs":{},"这":{"docs":{},"就":{"docs":{},"保":{"docs":{},"证":{"docs":{},"了":{"docs":{},"在":{"docs":{},"大":{"docs":{},"部":{"docs":{},"分":{"docs":{},"的":{"docs":{},"应":{"docs":{},"用":{"docs":{},"场":{"docs":{},"景":{"docs":{},"下":{"docs":{},"很":{"docs":{},"高":{"docs":{},"的":{"docs":{},"内":{"docs":{},"存":{"docs":{},"利":{"docs":{},"用":{"docs":{},"效":{"docs":{},"率":{"docs":{},",":{"docs":{},"并":{"docs":{},"保":{"docs":{},"证":{"docs":{},"了":{"docs":{},"在":{"docs":{},"各":{"docs":{},"个":{"docs":{},"场":{"docs":{},"景":{"docs":{},"下":{"docs":{},"的":{"docs":{},"正":{"docs":{},"确":{"docs":{},"性":{"docs":{},"。":{"docs":{},"当":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},",":{"docs":{},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"u":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}},"。":{"docs":{},"接":{"docs":{},"下":{"docs":{},"来":{"docs":{},"就":{"docs":{},"详":{"docs":{},"细":{"docs":{},"分":{"docs":{},"析":{"docs":{},"一":{"docs":{},"下":{"docs":{},"相":{"docs":{},"关":{"docs":{},"流":{"docs":{},"程":{"docs":{},"。":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}},"操":{"docs":{},"作":{"docs":{},"字":{"docs":{},"典":{"docs":{},"如":{"docs":{},"下":{"docs":{},"所":{"docs":{},"示":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}},"i":{"docs":{},"n":{"docs":{},"d":{"docs":{},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}},"w":{"docs":{},"a":{"docs":{},"r":{"docs":{},"g":{"docs":{},"s":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}},"一":{"docs":{},"个":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"用":{"docs":{},"于":{"docs":{},"垃":{"docs":{},"圾":{"docs":{},"回":{"docs":{},"收":{"docs":{},"的":{"docs":{},"双":{"docs":{},"向":{"docs":{},"链":{"docs":{},"表":{"docs":{},",":{"docs":{},"一":{"docs":{},"个":{"docs":{},"引":{"docs":{},"用":{"docs":{},"计":{"docs":{},"数":{"docs":{},"变":{"docs":{},"量":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}}}}},"类":{"docs":{},"型":{"docs":{},"对":{"docs":{},"象":{"docs":{},"指":{"docs":{},"针":{"docs":{},"o":{"docs":{},"b":{"docs":{},"_":{"docs":{},"t":{"docs":{},"y":{"docs":{},"p":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}},"数":{"docs":{},"的":{"docs":{},"绝":{"docs":{},"对":{"docs":{},"值":{"docs":{},"等":{"docs":{},"价":{"docs":{},"于":{"docs":{},"下":{"docs":{},"面":{"docs":{},"的":{"docs":{},"表":{"docs":{},"达":{"docs":{},"式":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}},"些":{"docs":{},"对":{"docs":{},"象":{"docs":{},"属":{"docs":{},"性":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}},"整":{"docs":{},"数":{"docs":{},"在":{"docs":{},"一":{"docs":{},"开":{"docs":{},"始":{"docs":{},"就":{"docs":{},"会":{"docs":{},"被":{"docs":{},"初":{"docs":{},"始":{"docs":{},"化":{"docs":{},"一":{"docs":{},"直":{"docs":{},"留":{"docs":{},"存":{"docs":{},",":{"docs":{},"当":{"docs":{},"再":{"docs":{},"次":{"docs":{},"使":{"docs":{},"用":{"docs":{},"直":{"docs":{},"接":{"docs":{},"从":{"docs":{},"小":{"docs":{},"整":{"docs":{},"数":{"docs":{},"对":{"docs":{},"象":{"docs":{},"池":{"docs":{},"中":{"docs":{},"获":{"docs":{},"取":{"docs":{},",":{"docs":{},"不":{"docs":{},"用":{"docs":{},"频":{"docs":{},"繁":{"docs":{},"的":{"docs":{},"申":{"docs":{},"请":{"docs":{},"内":{"docs":{},"存":{"docs":{},"。":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"堆":{"docs":{},"方":{"docs":{},"法":{"docs":{},"定":{"docs":{},"义":{"docs":{},",":{"docs":{},"函":{"docs":{},"数":{"docs":{},"和":{"docs":{},"指":{"docs":{},"针":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}},"下":{"docs":{},"图":{"docs":{},"是":{"docs":{},"对":{"docs":{},"象":{"docs":{},"运":{"docs":{},"行":{"docs":{},"时":{"docs":{},"的":{"docs":{},"图":{"docs":{},"像":{"docs":{},"表":{"docs":{},"现":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}},"与":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"类":{"docs":{},"型":{"docs":{},"相":{"docs":{},"关":{"docs":{},"的":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}},"该":{"docs":{},"类":{"docs":{},"型":{"docs":{},"对":{"docs":{},"象":{"docs":{},"相":{"docs":{},"关":{"docs":{},"的":{"docs":{},"操":{"docs":{},"作":{"docs":{},"信":{"docs":{},"息":{"docs":{},"(":{"docs":{},"如":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}},"操":{"docs":{},"作":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}},"普":{"docs":{},"通":{"docs":{},"四":{"docs":{},"则":{"docs":{},"运":{"docs":{},"算":{"docs":{},"减":{"docs":{},"法":{"docs":{},"相":{"docs":{},"同":{"docs":{},",":{"docs":{},"数":{"docs":{},"不":{"docs":{},"够":{"docs":{},"大":{"docs":{},"则":{"docs":{},"向":{"docs":{},"高":{"docs":{},"一":{"docs":{},"位":{"docs":{},"借":{"docs":{},"位":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}}}}}}}}}},"h":{"docs":{},"a":{"docs":{},"s":{"docs":{},"h":{"docs":{},"求":{"docs":{},"和":{"docs":{},"的":{"docs":{},"m":{"docs":{},"a":{"docs":{},"s":{"docs":{},"k":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}},"为":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.00338409475465313}},"了":{"docs":{},"方":{"docs":{},"便":{"docs":{},"对":{"docs":{},"这":{"docs":{},"部":{"docs":{},"分":{"docs":{},"内":{"docs":{},"存":{"docs":{},"初":{"docs":{},"始":{"docs":{},"化":{"docs":{},",":{"docs":{},"p":{"docs":{},"y":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"n":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}}},"避":{"docs":{},"免":{"docs":{},"频":{"docs":{},"繁":{"docs":{},"的":{"docs":{},"申":{"docs":{},"请":{"docs":{},"内":{"docs":{},"存":{"docs":{},"空":{"docs":{},"间":{"docs":{},",":{"docs":{},"创":{"docs":{},"建":{"docs":{},"p":{"docs":{},"y":{"docs":{},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},"的":{"docs":{},"时":{"docs":{},"候":{"docs":{},"会":{"docs":{},"先":{"docs":{},"检":{"docs":{},"查":{"docs":{},"缓":{"docs":{},"冲":{"docs":{},"池":{"docs":{},"是":{"docs":{},"否":{"docs":{},"有":{"docs":{},"可":{"docs":{},"用":{"docs":{},"空":{"docs":{},"间":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"8":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"主":{"docs":{},"要":{"docs":{},"用":{"docs":{},"于":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}},"就":{"docs":{},"是":{"docs":{},"通":{"docs":{},"过":{"docs":{},"传":{"docs":{},"入":{"docs":{},"的":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}},"依":{"docs":{},"靠":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}},"是":{"docs":{},"检":{"docs":{},"查":{"docs":{},"是":{"docs":{},"否":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}},"之":{"docs":{},"后":{"docs":{},",":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}},"间":{"docs":{},",":{"docs":{},"如":{"docs":{},"果":{"docs":{},"超":{"docs":{},"过":{"docs":{},"这":{"docs":{},"个":{"docs":{},"阈":{"docs":{},"值":{"docs":{},"则":{"docs":{},"字":{"docs":{},"典":{"docs":{},"就":{"docs":{},"会":{"docs":{},"自":{"docs":{},"动":{"docs":{},"扩":{"docs":{},"容":{"docs":{},",":{"docs":{},"扩":{"docs":{},"容":{"docs":{},"的":{"docs":{},"策":{"docs":{},"略":{"docs":{},"大":{"docs":{},"家":{"docs":{},"可":{"docs":{},"详":{"docs":{},"细":{"docs":{},"查":{"docs":{},"看":{"docs":{},"源":{"docs":{},"码":{"docs":{},"。":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"从":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0025380710659898475},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"代":{"docs":{},"码":{"docs":{},"中":{"docs":{},"可":{"docs":{},"以":{"docs":{},"看":{"docs":{},"出":{"docs":{},"p":{"docs":{},"y":{"docs":{},"v":{"docs":{},"a":{"docs":{},"r":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},"比":{"docs":{},"p":{"docs":{},"y":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},"多":{"docs":{},"出":{"docs":{},"了":{"docs":{},"一":{"docs":{},"个":{"docs":{},"用":{"docs":{},"于":{"docs":{},"存":{"docs":{},"储":{"docs":{},"元":{"docs":{},"素":{"docs":{},"个":{"docs":{},"数":{"docs":{},"的":{"docs":{},"变":{"docs":{},"量":{"docs":{},"o":{"docs":{},"b":{"docs":{},"_":{"docs":{},"s":{"docs":{},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},"。":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"源":{"docs":{},"码":{"docs":{},"可":{"docs":{},"以":{"docs":{},"看":{"docs":{},"出":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}},"a":{"docs":{},"p":{"docs":{},"p":{"1":{"docs":{},"代":{"docs":{},"码":{"docs":{},"可":{"docs":{},"以":{"docs":{},"看":{"docs":{},"出":{"docs":{},"追":{"docs":{},"加":{"docs":{},"元":{"docs":{},"素":{"docs":{},"操":{"docs":{},"作":{"docs":{},"大":{"docs":{},"致":{"docs":{},"流":{"docs":{},"程":{"docs":{},"如":{"docs":{},"下":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}}}}}}}}}}},"docs":{}}}},"i":{"docs":{},"n":{"docs":{},"s":{"1":{"docs":{},"代":{"docs":{},"码":{"docs":{},"可":{"docs":{},"以":{"docs":{},"看":{"docs":{},"出":{"docs":{},"插":{"docs":{},"入":{"docs":{},"元":{"docs":{},"素":{"docs":{},"操":{"docs":{},"作":{"docs":{},"大":{"docs":{},"致":{"docs":{},"流":{"docs":{},"程":{"docs":{},"如":{"docs":{},"下":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}}}}}}}}}}},"docs":{}}}},"该":{"docs":{},"函":{"docs":{},"数":{"docs":{},"的":{"docs":{},"执":{"docs":{},"行":{"docs":{},"可":{"docs":{},"知":{"docs":{},",":{"docs":{},"初":{"docs":{},"始":{"docs":{},"化":{"docs":{},"的":{"docs":{},"函":{"docs":{},"数":{"docs":{},"是":{"docs":{},"从":{"docs":{},"_":{"docs":{},"p":{"docs":{},"y":{"docs":{},"d":{"docs":{},"i":{"docs":{},"c":{"docs":{},"t":{"docs":{},"_":{"docs":{},"n":{"docs":{},"e":{"docs":{},"w":{"docs":{},"p":{"docs":{},"r":{"docs":{},"e":{"docs":{},"s":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"输":{"docs":{},"出":{"docs":{},"内":{"docs":{},"容":{"docs":{},"可":{"docs":{},"知":{"docs":{},",":{"docs":{},"字":{"docs":{},"典":{"docs":{},"的":{"docs":{},"大":{"docs":{},"小":{"docs":{},"随":{"docs":{},"之":{"docs":{},"改":{"docs":{},"变":{"docs":{},"了":{"docs":{},",":{"docs":{},"这":{"docs":{},"也":{"docs":{},"说":{"docs":{},"明":{"docs":{},"了":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}}}}}}},"以":{"docs":{},"p":{"docs":{},"y":{"docs":{},"l":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"_":{"docs":{},"t":{"docs":{},"y":{"docs":{},"p":{"docs":{},"e":{"docs":{},"为":{"docs":{},"例":{"docs":{},",":{"docs":{},"可":{"docs":{},"以":{"docs":{},"清":{"docs":{},"晰":{"docs":{},"的":{"docs":{},"看":{"docs":{},"到":{"docs":{},"一":{"docs":{},"般":{"docs":{},"的":{"docs":{},"类":{"docs":{},"型":{"docs":{},"对":{"docs":{},"象":{"docs":{},"和":{"docs":{},"p":{"docs":{},"y":{"docs":{},"t":{"docs":{},"y":{"docs":{},"p":{"docs":{},"e":{"docs":{},"_":{"docs":{},"t":{"docs":{},"y":{"docs":{},"p":{"docs":{},"e":{"docs":{},"之":{"docs":{},"间":{"docs":{},"的":{"docs":{},"关":{"docs":{},"系":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"下":{"docs":{},"是":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}},"但":{"docs":{},"这":{"docs":{},"并":{"docs":{},"不":{"docs":{},"意":{"docs":{},"味":{"docs":{},"着":{"docs":{},"最":{"docs":{},"终":{"docs":{},"一":{"docs":{},"定":{"docs":{},"会":{"docs":{},"调":{"docs":{},"用":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}},"是":{"docs":{},"f":{"docs":{},"i":{"docs":{},"l":{"docs":{},"l":{"docs":{},"数":{"docs":{},"量":{"docs":{},"未":{"docs":{},"变":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}},"决":{"docs":{},"定":{"docs":{},"的":{"docs":{},",":{"6":{"4":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}},"docs":{}},"docs":{},"那":{"docs":{},"么":{"docs":{},"类":{"docs":{},"型":{"docs":{},"对":{"docs":{},"象":{"docs":{},"的":{"docs":{},"类":{"docs":{},"型":{"docs":{},"是":{"docs":{},"由":{"docs":{},"谁":{"docs":{},"决":{"docs":{},"定":{"docs":{},"的":{"docs":{},"呢":{"docs":{},"?":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}}}}}},"创":{"docs":{},"建":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}},"一":{"docs":{},"个":{"docs":{},"对":{"docs":{},"象":{"docs":{},"比":{"docs":{},"如":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}},"对":{"docs":{},"象":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}},"有":{"docs":{},"两":{"docs":{},"种":{"docs":{},"方":{"docs":{},"式":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}},"该":{"docs":{},"类":{"docs":{},"型":{"docs":{},"对":{"docs":{},"象":{"docs":{},"分":{"docs":{},"配":{"docs":{},"的":{"docs":{},"内":{"docs":{},"存":{"docs":{},"空":{"docs":{},"间":{"docs":{},"大":{"docs":{},"小":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}},"时":{"docs":{},"分":{"docs":{},"配":{"docs":{},"的":{"docs":{},"空":{"docs":{},"间":{"docs":{},"大":{"docs":{},"小":{"docs":{},"信":{"docs":{},"息":{"docs":{},",":{"docs":{},"即":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}},"整":{"docs":{},"数":{"docs":{},"对":{"docs":{},"象":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}},"p":{"docs":{},"y":{"docs":{},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}}}}}},"初":{"docs":{},"始":{"docs":{},"化":{"docs":{},"代":{"docs":{},"码":{"docs":{},"中":{"docs":{},"看":{"docs":{},"到":{"docs":{},"绑":{"docs":{},"定":{"docs":{},"的":{"docs":{},"是":{"docs":{},"l":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"_":{"docs":{},"h":{"docs":{},"a":{"docs":{},"s":{"docs":{},"h":{"docs":{},"函":{"docs":{},"数":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}}}}},"数":{"docs":{},"据":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}},"的":{"docs":{},"时":{"docs":{},"候":{"docs":{},",":{"docs":{},"就":{"docs":{},"输":{"docs":{},"出":{"docs":{},"如":{"docs":{},"上":{"docs":{},"所":{"docs":{},"示":{"docs":{},"内":{"docs":{},"容":{"docs":{},";":{"docs":{},"我":{"docs":{},"们":{"docs":{},"接":{"docs":{},"下":{"docs":{},"来":{"docs":{},"继":{"docs":{},"续":{"docs":{},"操":{"docs":{},"作":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}}}},"都":{"docs":{},"为":{"docs":{},"0":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}},"状":{"docs":{},"态":{"docs":{},"。":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"为":{"docs":{},"空":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}},"到":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},"底":{"docs":{},"长":{"docs":{},"什":{"docs":{},"么":{"docs":{},"样":{"docs":{},"。":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}},"动":{"docs":{},"态":{"docs":{},"进":{"docs":{},"行":{"docs":{},"判":{"docs":{},"断":{"docs":{},",":{"docs":{},"而":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}},"双":{"docs":{},"向":{"docs":{},"链":{"docs":{},"表":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}},"变":{"docs":{},"量":{"docs":{},"来":{"docs":{},"维":{"docs":{},"护":{"docs":{},"这":{"docs":{},"个":{"docs":{},"对":{"docs":{},"象":{"docs":{},",":{"docs":{},"其":{"docs":{},"他":{"docs":{},"对":{"docs":{},"象":{"docs":{},"也":{"docs":{},"与":{"docs":{},"此":{"docs":{},"类":{"docs":{},"似":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}},",":{"docs":{},"这":{"docs":{},"个":{"docs":{},"变":{"docs":{},"量":{"docs":{},"维":{"docs":{},"护":{"docs":{},"对":{"docs":{},"象":{"docs":{},"的":{"docs":{},"引":{"docs":{},"用":{"docs":{},"计":{"docs":{},"数":{"docs":{},",":{"docs":{},"从":{"docs":{},"而":{"docs":{},"最":{"docs":{},"终":{"docs":{},"决":{"docs":{},"定":{"docs":{},"该":{"docs":{},"对":{"docs":{},"象":{"docs":{},"的":{"docs":{},"创":{"docs":{},"建":{"docs":{},"与":{"docs":{},"销":{"docs":{},"毁":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"长":{"docs":{},"对":{"docs":{},"象":{"docs":{},"都":{"docs":{},"拥":{"docs":{},"有":{"docs":{},"一":{"docs":{},"个":{"docs":{},"相":{"docs":{},"同":{"docs":{},"的":{"docs":{},"内":{"docs":{},"容":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}},"垃":{"docs":{},"圾":{"docs":{},"回":{"docs":{},"收":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}},"域":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}},"定":{"docs":{},"义":{"docs":{},"了":{"docs":{},"一":{"docs":{},"个":{"docs":{},"数":{"docs":{},"值":{"docs":{},"对":{"docs":{},"象":{"docs":{},"该":{"docs":{},"支":{"docs":{},"持":{"docs":{},"的":{"docs":{},"操":{"docs":{},"作":{"docs":{},"。":{"docs":{},"一":{"docs":{},"个":{"docs":{},"数":{"docs":{},"值":{"docs":{},"对":{"docs":{},"象":{"docs":{},"如":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}}}}}},"开":{"docs":{},"始":{"docs":{},"有":{"docs":{},"一":{"docs":{},"个":{"docs":{},"宏":{"docs":{},"p":{"docs":{},"y":{"docs":{},"o":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},"_":{"docs":{},"v":{"docs":{},"a":{"docs":{},"r":{"docs":{},"_":{"docs":{},"h":{"docs":{},"e":{"docs":{},"a":{"docs":{},"d":{"docs":{},",":{"docs":{},"查":{"docs":{},"看":{"docs":{},"源":{"docs":{},"码":{"docs":{},"可":{"docs":{},"知":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"长":{"docs":{},"对":{"docs":{},"象":{"docs":{},"与":{"docs":{},"变":{"docs":{},"长":{"docs":{},"对":{"docs":{},"象":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}},"容":{"docs":{},"纳":{"docs":{},"其":{"docs":{},"他":{"docs":{},"对":{"docs":{},"象":{"docs":{},"的":{"docs":{},"序":{"docs":{},"列":{"docs":{},"集":{"docs":{},"合":{"docs":{},"对":{"docs":{},"象":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}},"器":{"docs":{},"的":{"docs":{},"相":{"docs":{},"关":{"docs":{},"数":{"docs":{},"据":{"docs":{},"结":{"docs":{},"构":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}},"就":{"docs":{},"指":{"docs":{},"定":{"docs":{},"了":{"docs":{},"它":{"docs":{},"进":{"docs":{},"行":{"docs":{},"加":{"docs":{},"法":{"docs":{},"操":{"docs":{},"作":{"docs":{},"时":{"docs":{},"的":{"docs":{},"具":{"docs":{},"体":{"docs":{},"行":{"docs":{},"为":{"docs":{},"。":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}},"是":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}},"哈":{"docs":{},"希":{"docs":{},"生":{"docs":{},"成":{"docs":{},"的":{"docs":{},"值":{"docs":{},",":{"docs":{},"m":{"docs":{},"e":{"docs":{},"_":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}},"对":{"docs":{},"应":{"docs":{},"的":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},"值":{"docs":{},"。":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"根":{"docs":{},"据":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"记":{"docs":{},"录":{"docs":{},"了":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}},"保":{"docs":{},"存":{"docs":{},"的":{"docs":{},"数":{"docs":{},"据":{"docs":{},"的":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},",":{"docs":{},"h":{"docs":{},"a":{"docs":{},"s":{"docs":{},"h":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}},"表":{"docs":{},"示":{"docs":{},"该":{"docs":{},"处":{"docs":{},"未":{"docs":{},"使":{"docs":{},"用":{"docs":{},"。":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}},"对":{"docs":{},"应":{"docs":{},"一":{"docs":{},"个":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}},"进":{"docs":{},"行":{"docs":{},"两":{"docs":{},"倍":{"docs":{},"扩":{"docs":{},"充":{"docs":{},"否":{"docs":{},"则":{"docs":{},"就":{"docs":{},"进":{"docs":{},"行":{"docs":{},"四":{"docs":{},"倍":{"docs":{},"扩":{"docs":{},"充":{"docs":{},"。":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}},"建":{"docs":{},"立":{"docs":{},"联":{"docs":{},"系":{"docs":{},"的":{"docs":{},"。":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}},"引":{"docs":{},"用":{"docs":{},"计":{"docs":{},"数":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.002886002886002886},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"我":{"docs":{},"们":{"docs":{},"不":{"docs":{},"知":{"docs":{},"道":{"docs":{},"这":{"docs":{},"个":{"docs":{},"指":{"docs":{},"针":{"docs":{},"所":{"docs":{},"指":{"docs":{},"的":{"docs":{},"对":{"docs":{},"象":{"docs":{},"是":{"docs":{},"什":{"docs":{},"么":{"docs":{},"类":{"docs":{},"型":{"docs":{},",":{"docs":{},"只":{"docs":{},"能":{"docs":{},"通":{"docs":{},"过":{"docs":{},"所":{"docs":{},"指":{"docs":{},"对":{"docs":{},"象":{"docs":{},"的":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"指":{"docs":{},"向":{"docs":{},"类":{"docs":{},"型":{"docs":{},"对":{"docs":{},"象":{"docs":{},"的":{"docs":{},"指":{"docs":{},"针":{"docs":{},",":{"docs":{},"决":{"docs":{},"定":{"docs":{},"了":{"docs":{},"对":{"docs":{},"象":{"docs":{},"的":{"docs":{},"类":{"docs":{},"型":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}},"明":{"docs":{},"了":{"docs":{},"该":{"docs":{},"类":{"docs":{},"型":{"docs":{},"对":{"docs":{},"象":{"docs":{},"如":{"docs":{},"何":{"docs":{},"生":{"docs":{},"成":{"docs":{},"其":{"docs":{},"h":{"docs":{},"a":{"docs":{},"s":{"docs":{},"h":{"docs":{},"值":{"docs":{},"。":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}}},"针":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}},"令":{"docs":{},",":{"docs":{},"初":{"docs":{},"始":{"docs":{},"化":{"docs":{},"完":{"docs":{},"成":{"docs":{},"之":{"docs":{},"后":{"docs":{},",":{"docs":{},"就":{"docs":{},"调":{"docs":{},"用":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}},"接":{"docs":{},"下":{"docs":{},"来":{"docs":{},"我":{"docs":{},"们":{"docs":{},"看":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}},"一":{"docs":{},"下":{"docs":{},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{},"u":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}},"数":{"docs":{},"值":{"docs":{},"对":{"docs":{},"象":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}},"操":{"docs":{},"作":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}},"中":{"docs":{},"移":{"docs":{},"除":{"docs":{},"了":{"docs":{},"该":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}},"组":{"docs":{},"的":{"docs":{},"低":{"docs":{},"位":{"docs":{},"开":{"docs":{},"始":{"docs":{},"依":{"docs":{},"次":{"docs":{},"按":{"docs":{},"位":{"docs":{},"相":{"docs":{},"加":{"docs":{},",":{"docs":{},"c":{"docs":{},"a":{"docs":{},"r":{"docs":{},"r":{"docs":{},"i":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}}}}}},"时":{"docs":{},",":{"docs":{},"会":{"docs":{},"分":{"docs":{},"配":{"docs":{},"内":{"docs":{},"存":{"docs":{},"进":{"docs":{},"行":{"docs":{},"初":{"docs":{},"始":{"docs":{},"化":{"docs":{},",":{"docs":{},"然":{"docs":{},"后":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"_":{"docs":{},"r":{"docs":{},"e":{"docs":{},"s":{"docs":{},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},"只":{"docs":{},"会":{"docs":{},"改":{"docs":{},"变":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}}}}}}},"m":{"docs":{},"e":{"docs":{},"_":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}},"来":{"docs":{},"增":{"docs":{},"加":{"docs":{},"和":{"docs":{},"减":{"docs":{},"少":{"docs":{},"对":{"docs":{},"一":{"docs":{},"个":{"docs":{},"对":{"docs":{},"象":{"docs":{},"的":{"docs":{},"引":{"docs":{},"用":{"docs":{},"计":{"docs":{},"数":{"docs":{},"。":{"docs":{},"当":{"docs":{},"一":{"docs":{},"个":{"docs":{},"对":{"docs":{},"象":{"docs":{},"的":{"docs":{},"引":{"docs":{},"用":{"docs":{},"计":{"docs":{},"数":{"docs":{},"减":{"docs":{},"少":{"docs":{},"到":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"创":{"docs":{},"建":{"docs":{},"一":{"docs":{},"个":{"docs":{},"新":{"docs":{},"的":{"docs":{},"字":{"docs":{},"典":{"docs":{},",":{"docs":{},"接":{"docs":{},"着":{"docs":{},"就":{"docs":{},"对":{"docs":{},"新":{"docs":{},"建":{"docs":{},"的":{"docs":{},"字":{"docs":{},"典":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}},"实":{"docs":{},"现":{"docs":{},"数":{"docs":{},"据":{"docs":{},"的":{"docs":{},",":{"docs":{},"详":{"docs":{},"情":{"docs":{},"如":{"docs":{},"下":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}},"保":{"docs":{},"存":{"docs":{},"数":{"docs":{},"据":{"docs":{},"值":{"docs":{},"的":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}},"合":{"docs":{},"并":{"docs":{},"集":{"docs":{},"合":{"docs":{},"。":{"docs":{},"接":{"docs":{},"下":{"docs":{},"来":{"docs":{},"就":{"docs":{},"详":{"docs":{},"细":{"docs":{},"分":{"docs":{},"析":{"docs":{},"一":{"docs":{},"下":{"docs":{},"相":{"docs":{},"关":{"docs":{},"的":{"docs":{},"操":{"docs":{},"作":{"docs":{},"流":{"docs":{},"程":{"docs":{},"。":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}}}}}}},"更":{"docs":{},"新":{"docs":{},"集":{"docs":{},"合":{"docs":{},",":{"docs":{},"通":{"docs":{},"过":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}},"正":{"docs":{},"是":{"docs":{},"通":{"docs":{},"过":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}},"相":{"docs":{},"同":{"docs":{},",":{"docs":{},"大":{"docs":{},"家":{"docs":{},"可":{"docs":{},"以":{"docs":{},"自":{"docs":{},"行":{"docs":{},"查":{"docs":{},"阅":{"docs":{},"源":{"docs":{},"码":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}},"如":{"docs":{},"果":{"docs":{},"相":{"docs":{},"同":{"docs":{},"则":{"docs":{},"全":{"docs":{},"部":{"docs":{},"插":{"docs":{},"入":{"docs":{},",":{"docs":{},"如":{"docs":{},"果":{"docs":{},"不":{"docs":{},"同":{"docs":{},",":{"docs":{},"则":{"docs":{},"遍":{"docs":{},"历":{"docs":{},"旧":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}}}},"则":{"docs":{},"调":{"docs":{},"用":{"docs":{},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"_":{"docs":{},"a":{"docs":{},"s":{"docs":{},"s":{"docs":{},"_":{"docs":{},"s":{"docs":{},"l":{"docs":{},"i":{"docs":{},"c":{"docs":{},"e":{"docs":{},"进":{"docs":{},"行":{"docs":{},"移":{"docs":{},"除":{"docs":{},",":{"docs":{},"当":{"docs":{},"遍":{"docs":{},"历":{"docs":{},"完":{"docs":{},"列":{"docs":{},"表":{"docs":{},"还":{"docs":{},"未":{"docs":{},"找":{"docs":{},"到":{"docs":{},"则":{"docs":{},"报":{"docs":{},"错":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"的":{"docs":{},"就":{"docs":{},"将":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}},"并":{"docs":{},"且":{"docs":{},"需":{"docs":{},"要":{"docs":{},"重":{"docs":{},"新":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}},"关":{"docs":{},"数":{"docs":{},"据":{"docs":{},"结":{"docs":{},"构":{"docs":{},"的":{"docs":{},"内":{"docs":{},"存":{"docs":{},"布":{"docs":{},"局":{"docs":{},"为":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}},"答":{"docs":{},"案":{"docs":{},"就":{"docs":{},"是":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}},"类":{"docs":{},"似":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}},"型":{"docs":{},"名":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}},",":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}},"对":{"docs":{},"象":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.004329004329004329},"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}},"的":{"docs":{},"类":{"docs":{},"型":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}},"并":{"docs":{},"且":{"docs":{},"不":{"docs":{},"能":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"来":{"docs":{},"保":{"docs":{},"存":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"数":{"docs":{},"据":{"docs":{},",":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}},"考":{"docs":{},"虑":{"docs":{},"以":{"docs":{},"下":{"docs":{},"的":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}},"而":{"docs":{},"具":{"docs":{},"体":{"docs":{},"赋":{"docs":{},"值":{"docs":{},"绑":{"docs":{},"定":{"docs":{},"我":{"docs":{},"们":{"docs":{},"可":{"docs":{},"以":{"docs":{},"在":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}},"范":{"docs":{},"型":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}},"通":{"docs":{},"常":{"docs":{},"只":{"docs":{},"能":{"docs":{},"作":{"docs":{},"用":{"docs":{},"于":{"docs":{},"某":{"docs":{},"一":{"docs":{},"种":{"docs":{},"类":{"docs":{},"型":{"docs":{},"的":{"docs":{},"对":{"docs":{},"象":{"docs":{},"上":{"docs":{},",":{"docs":{},"对":{"docs":{},"于":{"docs":{},"每":{"docs":{},"一":{"docs":{},"种":{"docs":{},"内":{"docs":{},"建":{"docs":{},"对":{"docs":{},"象":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}}}}}}}}},"形":{"docs":{},"如":{"docs":{},"p":{"docs":{},"y":{"docs":{},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},"_":{"docs":{},"x":{"docs":{},"x":{"docs":{},"x":{"docs":{},"这":{"docs":{},"样":{"docs":{},"的":{"docs":{},"形":{"docs":{},"式":{"docs":{},"。":{"docs":{},"可":{"docs":{},"以":{"docs":{},"应":{"docs":{},"用":{"docs":{},"在":{"docs":{},"任":{"docs":{},"何":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"过":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"引":{"docs":{},"用":{"docs":{},"计":{"docs":{},"数":{"docs":{},"来":{"docs":{},"管":{"docs":{},"理":{"docs":{},"维":{"docs":{},"护":{"docs":{},"对":{"docs":{},"象":{"docs":{},"在":{"docs":{},"内":{"docs":{},"存":{"docs":{},"中":{"docs":{},"的":{"docs":{},"存":{"docs":{},"在":{"docs":{},"与":{"docs":{},"否":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}}}}},"字":{"docs":{},"节":{"docs":{},"码":{"docs":{},"指":{"docs":{},"令":{"docs":{},"可":{"docs":{},"知":{"docs":{},",":{"docs":{},"首":{"docs":{},"先":{"docs":{},"调":{"docs":{},"用":{"docs":{},"了":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}},"的":{"docs":{},"指":{"docs":{},"令":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}},"查":{"docs":{},"找":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"传":{"docs":{},"入":{"docs":{},"的":{"docs":{},"h":{"docs":{},"a":{"docs":{},"s":{"docs":{},"h":{"docs":{},"与":{"docs":{},"m":{"docs":{},"a":{"docs":{},"s":{"docs":{},"k":{"docs":{},"求":{"docs":{},"索":{"docs":{},"引":{"docs":{},"下":{"docs":{},"标":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}},"该":{"docs":{},"字":{"docs":{},"节":{"docs":{},"码":{"docs":{},"指":{"docs":{},"令":{"docs":{},"可":{"docs":{},"知":{"docs":{},",":{"docs":{},"创":{"docs":{},"建":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}},"都":{"docs":{},"提":{"docs":{},"供":{"docs":{},"了":{"docs":{},"这":{"docs":{},"样":{"docs":{},"一":{"docs":{},"组":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}},"有":{"docs":{},"o":{"docs":{},"b":{"docs":{},"_":{"docs":{},"r":{"docs":{},"e":{"docs":{},"f":{"docs":{},"c":{"docs":{},"n":{"docs":{},"t":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}},"不":{"docs":{},"为":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}},"是":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"释":{"docs":{},"放":{"docs":{},"内":{"docs":{},"存":{"docs":{},"空":{"docs":{},"间":{"docs":{},"。":{"docs":{},"因":{"docs":{},"为":{"docs":{},"频":{"docs":{},"繁":{"docs":{},"的":{"docs":{},"申":{"docs":{},"请":{"docs":{},"、":{"docs":{},"释":{"docs":{},"放":{"docs":{},"内":{"docs":{},"存":{"docs":{},"会":{"docs":{},"大":{"docs":{},"大":{"docs":{},"降":{"docs":{},"低":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}}}}}}}}}}}}}}}}}}}}}},"需":{"docs":{},"要":{"docs":{},"用":{"docs":{},"到":{"docs":{"objects/object/":{"ref":"objects/object/","tf":0.001443001443001443}}}}}},"%":{"docs":{},"d":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},"\\":{"docs":{},"n":{"docs":{},"\"":{"docs":{},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}},"l":{"docs":{},"d":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},"\\":{"docs":{},"n":{"docs":{},"\"":{"docs":{},",":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251}}}}}}}}},"+":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.00338409475465313},"objects/list-object/":{"ref":"objects/list-object/","tf":0.00823045267489712},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0018165304268846503},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0045691906005221935}}},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"@":{"docs":{},"c":{"docs":{},"l":{"docs":{},"a":{"docs":{},"s":{"docs":{},"s":{"docs":{},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"d":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}},"j":{"docs":{},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}},"m":{"docs":{},"e":{"docs":{},"_":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}},"q":{"docs":{},"u":{"docs":{},"i":{"docs":{},"c":{"docs":{},"k":{"docs":{},"_":{"docs":{},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},"_":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{},"s":{"docs":{},"+":{"docs":{},"+":{"docs":{},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}},",":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}},"n":{"docs":{},"e":{"docs":{},"g":{"docs":{},"_":{"docs":{},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},"_":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{},"s":{"docs":{},"+":{"docs":{},"+":{"docs":{},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}},";":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}}}}}}}},"|":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}},"|":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0027247956403269754},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0032637075718015664}}}},"且":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}},"乘":{"docs":{},"法":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}},"会":{"docs":{},"检":{"docs":{},"查":{"docs":{},"传":{"docs":{},"入":{"docs":{},"的":{"docs":{},"数":{"docs":{},"是":{"docs":{},"否":{"docs":{},"在":{"docs":{},"小":{"docs":{},"整":{"docs":{},"数":{"docs":{},"范":{"docs":{},"围":{"docs":{},"内":{"docs":{},",":{"docs":{},"如":{"docs":{},"果":{"docs":{},"是":{"docs":{},"直":{"docs":{},"接":{"docs":{},"返":{"docs":{},"回":{"docs":{},"。":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}}}}}}}}}}},"调":{"docs":{},"用":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}}}},"被":{"docs":{},"里":{"docs":{},"面":{"docs":{},"切":{"docs":{},"换":{"docs":{},"到":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}},"根":{"docs":{},"据":{"docs":{},"保":{"docs":{},"存":{"docs":{},"的":{"docs":{},"元":{"docs":{},"素":{"docs":{},"自":{"docs":{},"动":{"docs":{},"调":{"docs":{},"整":{"docs":{},"大":{"docs":{},"小":{"docs":{},"。":{"docs":{},"相":{"docs":{},"关":{"docs":{},"的":{"docs":{},"内":{"docs":{},"存":{"docs":{},"布":{"docs":{},"局":{"docs":{},"如":{"docs":{},"下":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}}}}}}}}},"做":{"docs":{},"处":{"docs":{},"理":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}},"进":{"docs":{},"位":{"docs":{},"处":{"docs":{},"理":{"docs":{},",":{"docs":{},"然":{"docs":{},"后":{"docs":{},"处":{"docs":{},"理":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}},"具":{"docs":{},"体":{"docs":{},"可":{"docs":{},"以":{"docs":{},"看":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}},"实":{"docs":{},"现":{"docs":{},"在":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}},"减":{"docs":{},"法":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},"运":{"docs":{},"算":{"docs":{},"函":{"docs":{},"数":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}},"少":{"docs":{},"该":{"docs":{},"对":{"docs":{},"象":{"docs":{},"引":{"docs":{},"用":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}},"分":{"docs":{},"成":{"docs":{},"位":{"docs":{},"数":{"docs":{},"较":{"docs":{},"少":{"docs":{},"的":{"docs":{},"数":{"docs":{},",":{"docs":{},"每":{"docs":{},"个":{"docs":{},"数":{"docs":{},"都":{"docs":{},"是":{"docs":{},"原":{"docs":{},"来":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}}},"加":{"docs":{},"法":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},"运":{"docs":{},"算":{"docs":{},"函":{"docs":{},"数":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}},"上":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"1":{"docs":{},"与":{"docs":{},"m":{"docs":{},"a":{"docs":{},"s":{"docs":{},"k":{"docs":{},"求":{"docs":{},"余":{"docs":{},"获":{"docs":{},"取":{"docs":{},"下":{"docs":{},"一":{"docs":{},"个":{"docs":{},"索":{"docs":{},"引":{"docs":{},"值":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}},"又":{"docs":{},"细":{"docs":{},"分":{"docs":{},"为":{"docs":{},"两":{"docs":{},"个":{"docs":{},"函":{"docs":{},"数":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}},"反":{"docs":{},"转":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}},"汇":{"docs":{},"编":{"docs":{},"获":{"docs":{},"取":{"docs":{},"该":{"docs":{},"脚":{"docs":{},"本":{"docs":{},"的":{"docs":{},"字":{"docs":{},"节":{"docs":{},"码":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}},"取":{"docs":{},"余":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}},"只":{"docs":{},"保":{"docs":{},"留":{"docs":{},"了":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}},"基":{"docs":{},"本":{"docs":{},"的":{"docs":{},"原":{"docs":{},"理":{"docs":{},"和":{"docs":{},"做":{"docs":{},"法":{"docs":{},"是":{"docs":{},"将":{"docs":{},"位":{"docs":{},"数":{"docs":{},"很":{"docs":{},"多":{"docs":{},"的":{"docs":{},"两":{"docs":{},"个":{"docs":{},"大":{"docs":{},"数":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}}}}}},"宏":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}},"异":{"docs":{},"或":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}},"有":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}},"根":{"docs":{},"据":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}},"索":{"docs":{},"引":{"docs":{},"返":{"docs":{},"回":{"docs":{},"对":{"docs":{},"应":{"docs":{},"的":{"docs":{},"元":{"docs":{},"素":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}},"经":{"docs":{},"验":{"docs":{},"在":{"docs":{},"1":{"docs":{},"/":{"2":{"docs":{},"和":{"docs":{},"2":{"docs":{},"/":{"3":{"docs":{},"之":{"docs":{},"间":{"docs":{},"效":{"docs":{},"果":{"docs":{},"最":{"docs":{},"好":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}},"docs":{}}}}},"docs":{}}}}}}}},"求":{"docs":{},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"l":{"docs":{},"值":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}},"幂":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}},"注":{"docs":{},":":{"docs":{},"这":{"docs":{},"里":{"docs":{},"的":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}},"添":{"docs":{},"加":{"docs":{},"打":{"docs":{},"印":{"docs":{},"代":{"docs":{},"码":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}},"确":{"docs":{},"保":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.001692047377326565}}}},"算":{"docs":{},"法":{"docs":{},"的":{"docs":{},"实":{"docs":{},"现":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}},"绝":{"docs":{},"对":{"docs":{},"值":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}},"调":{"docs":{},"用":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0025380710659898475},"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}},"_":{"docs":{},"p":{"docs":{},"y":{"docs":{},"l":{"docs":{},"o":{"docs":{},"n":{"docs":{},"g":{"docs":{},"_":{"docs":{},"f":{"docs":{},"r":{"docs":{},"o":{"docs":{},"m":{"docs":{},"b":{"docs":{},"y":{"docs":{},"t":{"docs":{},"e":{"docs":{},"s":{"docs":{},",":{"docs":{},"最":{"docs":{},"终":{"docs":{},"调":{"docs":{},"用":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}}}}}}}}}}}}}}}}}}}},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"_":{"docs":{},"r":{"docs":{},"e":{"docs":{},"s":{"docs":{},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},",":{"docs":{},"将":{"docs":{},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"大":{"docs":{},"小":{"docs":{},"加":{"docs":{},"一":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}}}}}}}}}}}}}}}}}}}}}}},"查":{"docs":{},"找":{"docs":{},"方":{"docs":{},"法":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"索":{"docs":{},"引":{"docs":{},"插":{"docs":{},"入":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"该":{"docs":{},"m":{"docs":{},"p":{"docs":{},"_":{"docs":{},"a":{"docs":{},"s":{"docs":{},"s":{"docs":{},"_":{"docs":{},"s":{"docs":{},"u":{"docs":{},"b":{"docs":{},"s":{"docs":{},"c":{"docs":{},"r":{"docs":{},"i":{"docs":{},"p":{"docs":{},"t":{"docs":{},"方":{"docs":{},"法":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}},"方":{"docs":{},"法":{"docs":{},"设":{"docs":{},"置":{"docs":{},"值":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},"本":{"docs":{},"身":{"docs":{},"的":{"docs":{},"方":{"docs":{},"法":{"docs":{},"比":{"docs":{},"较":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}},"了":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}},"整":{"docs":{},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"大":{"docs":{},"小":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}},"存":{"docs":{},"储":{"docs":{},"空":{"docs":{},"间":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}},"逻":{"docs":{},"辑":{"docs":{},"右":{"docs":{},"移":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}},"左":{"docs":{},"移":{"docs":{"objects/long-object/":{"ref":"objects/long-object/","tf":0.0008460236886632825}}}}}},")":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531},"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0009082652134423251},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"e":{"docs":{},"p":{"0":{"1":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},"docs":{}},"docs":{}}},"k":{"docs":{},"e":{"docs":{},"y":{"1":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"docs":{}}}}},"元":{"docs":{},"素":{"docs":{},"赋":{"docs":{},"值":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}},"的":{"docs":{},"示":{"docs":{},"例":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}},"列":{"docs":{},"表":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"d":{"docs":{},"的":{"docs":{},"增":{"docs":{},"长":{"docs":{},"模":{"docs":{},"式":{"docs":{},"是":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}}}}}}}}},"合":{"docs":{},"法":{"docs":{},"性":{"docs":{},"检":{"docs":{},"查":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}},"当":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}},"删":{"docs":{},"除":{"docs":{},"的":{"docs":{},"时":{"docs":{},"候":{"docs":{},",":{"docs":{},"d":{"docs":{},"u":{"docs":{},"m":{"docs":{},"m":{"docs":{},"i":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}},"我":{"docs":{},"们":{"docs":{},"继":{"docs":{},"续":{"docs":{},"向":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"被":{"docs":{},"创":{"docs":{},"建":{"docs":{},"的":{"docs":{},"字":{"docs":{},"典":{"docs":{},"是":{"docs":{},"用":{"docs":{},"来":{"docs":{},"保":{"docs":{},"存":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}},"插":{"docs":{},"入":{"docs":{},"元":{"docs":{},"素":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}}}},"到":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},",":{"docs":{},"这":{"docs":{},"就":{"docs":{},"是":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"的":{"docs":{},"概":{"docs":{},"述":{"docs":{},"如":{"docs":{},"下":{"docs":{},",":{"docs":{},"默":{"docs":{},"认":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}},"示":{"docs":{},"例":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}},"脚":{"docs":{},"本":{"docs":{},"如":{"docs":{},"下":{"docs":{},":":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}},"移":{"docs":{},"除":{"docs":{},"元":{"docs":{},"素":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}},"示":{"docs":{},"例":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}},"动":{"docs":{},"弹":{"docs":{},"栈":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}},"获":{"docs":{},"取":{"docs":{},"元":{"docs":{},"素":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}},"的":{"docs":{},"示":{"docs":{},"例":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},"s":{"docs":{},"的":{"docs":{},"首":{"docs":{},"个":{"docs":{},"元":{"docs":{},"素":{"docs":{},"地":{"docs":{},"址":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}},"下":{"docs":{},"一":{"docs":{},"个":{"docs":{},"位":{"docs":{},"置":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"元":{"docs":{},"素":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}},"作":{"docs":{},"为":{"docs":{},"队":{"docs":{},"列":{"docs":{},"的":{"docs":{},"操":{"docs":{},"作":{"docs":{},"集":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}},"大":{"docs":{},"小":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"存":{"docs":{},"取":{"docs":{},"的":{"docs":{},"地":{"docs":{},"址":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"最":{"docs":{},"小":{"docs":{},"的":{"docs":{},"值":{"docs":{},",":{"docs":{},"在":{"docs":{},"新":{"docs":{},"建":{"docs":{},"一":{"docs":{},"个":{"docs":{},"空":{"docs":{},"的":{"docs":{},"字":{"docs":{},"典":{"docs":{},"的":{"docs":{},"时":{"docs":{},"候":{"docs":{},"该":{"docs":{},"值":{"docs":{},"为":{"docs":{},"0":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}}}},"生":{"docs":{},"成":{"docs":{},"的":{"docs":{},"最":{"docs":{},"终":{"docs":{},"的":{"docs":{},"值":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}},"类":{"docs":{},"型":{"docs":{},"的":{"docs":{},"t":{"docs":{},"p":{"docs":{},"_":{"docs":{},"a":{"docs":{},"s":{"docs":{},"_":{"docs":{},"m":{"docs":{},"a":{"docs":{},"p":{"docs":{},"p":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"方":{"docs":{},"法":{"docs":{},"集":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}},"该":{"docs":{},"位":{"docs":{},"置":{"docs":{},"元":{"docs":{},"素":{"docs":{},"值":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"值":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}},"s":{"docs":{},"o":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}},"传":{"docs":{},"入":{"docs":{},"值":{"docs":{},"的":{"docs":{},"h":{"docs":{},"a":{"docs":{},"s":{"docs":{},"h":{"docs":{},"值":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}},"当":{"docs":{},"前":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"r":{"docs":{},"i":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}},"新":{"docs":{},"t":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{},"e":{"docs":{},"的":{"docs":{},"地":{"docs":{},"址":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}},"的":{"docs":{},"m":{"docs":{},"a":{"docs":{},"s":{"docs":{},"k":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}},"索":{"docs":{},"引":{"docs":{},"对":{"docs":{},"应":{"docs":{},"的":{"docs":{},"值":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}},"追":{"docs":{},"加":{"docs":{},"元":{"docs":{},"素":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0027434842249657062}}}}}},"随":{"docs":{},"着":{"docs":{},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"元":{"docs":{},"素":{"docs":{},"的":{"docs":{},"减":{"docs":{},"少":{"docs":{},",":{"docs":{},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"的":{"docs":{},"存":{"docs":{},"储":{"docs":{},"空":{"docs":{},"间":{"docs":{},"可":{"docs":{},"能":{"docs":{},"存":{"docs":{},"在":{"docs":{},"冗":{"docs":{},"余":{"docs":{},",":{"docs":{},"这":{"docs":{},"个":{"docs":{},"时":{"docs":{},"候":{"docs":{},"就":{"docs":{},"需":{"docs":{},"要":{"docs":{},"缩":{"docs":{},"小":{"docs":{},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"的":{"docs":{},"存":{"docs":{},"储":{"docs":{},"空":{"docs":{},"间":{"docs":{},"。":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"增":{"docs":{},"加":{"docs":{},",":{"docs":{},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"的":{"docs":{},"存":{"docs":{},"储":{"docs":{},"空":{"docs":{},"间":{"docs":{},"可":{"docs":{},"能":{"docs":{},"会":{"docs":{},"不":{"docs":{},"够":{"docs":{},"用":{"docs":{},",":{"docs":{},"这":{"docs":{},"个":{"docs":{},"时":{"docs":{},"候":{"docs":{},"就":{"docs":{},"需":{"docs":{},"要":{"docs":{},"扩":{"docs":{},"大":{"docs":{},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"的":{"docs":{},"存":{"docs":{},"储":{"docs":{},"空":{"docs":{},"间":{"docs":{},"。":{"docs":{"objects/list-object/":{"ref":"objects/list-object/","tf":0.0013717421124828531}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},":":{"0":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.0036330608537693005}}},"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.04495912806539509},"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"\"":{"docs":{},")":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"便":{"docs":{},"利":{"docs":{},"m":{"docs":{},"a":{"docs":{},"_":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}},"保":{"docs":{},"存":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}},"计":{"docs":{},"算":{"docs":{},"得":{"docs":{},"出":{"docs":{},"的":{"docs":{},"h":{"docs":{},"a":{"docs":{},"s":{"docs":{},"h":{"docs":{},"值":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}},"数":{"docs":{},"据":{"docs":{},"的":{"docs":{},"数":{"docs":{},"组":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"数":{"docs":{},"组":{"docs":{},"指":{"docs":{},"针":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}},"值":{"docs":{},"与":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},",":{"docs":{},"m":{"docs":{},"e":{"docs":{},"_":{"docs":{},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"u":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}},"因":{"docs":{},"为":{"docs":{},"字":{"docs":{},"典":{"docs":{},"也":{"docs":{},"被":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}},"如":{"docs":{},"果":{"docs":{},"计":{"docs":{},"算":{"docs":{},"出":{"docs":{},"的":{"docs":{},"索":{"docs":{},"引":{"docs":{},"值":{"docs":{},",":{"docs":{},"没":{"docs":{},"有":{"docs":{},"值":{"docs":{},",":{"docs":{},"则":{"docs":{},"直":{"docs":{},"接":{"docs":{},"将":{"docs":{},"该":{"docs":{},"值":{"docs":{},"存":{"docs":{},"入":{"docs":{},"对":{"docs":{},"应":{"docs":{},"的":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}}}}}}}}}},"减":{"docs":{},"1":{"docs":{},",":{"docs":{},"此":{"docs":{},"处":{"docs":{},"没":{"docs":{},"有":{"docs":{},"减":{"docs":{},"去":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}},"偏":{"docs":{},"移":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"內":{"docs":{},"建":{"docs":{},"函":{"docs":{},"数":{"docs":{},"与":{"docs":{},"{":{"docs":{},"}":{"docs":{},"生":{"docs":{},"成":{"docs":{},"的":{"docs":{},"字":{"docs":{},"典":{"docs":{},",":{"docs":{},"模":{"docs":{},"块":{"docs":{},"和":{"docs":{},"大":{"docs":{},"部":{"docs":{},"分":{"docs":{},"其":{"docs":{},"他":{"docs":{},"字":{"docs":{},"典":{"docs":{},"都":{"docs":{},"会":{"docs":{},"创":{"docs":{},"建":{"docs":{},"为":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"判":{"docs":{},"断":{"docs":{},"不":{"docs":{},"能":{"docs":{},"为":{"docs":{},"空":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"缓":{"docs":{},"冲":{"docs":{},"池":{"docs":{},"是":{"docs":{},"否":{"docs":{},"有":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}},"哈":{"docs":{},"希":{"docs":{},"查":{"docs":{},"找":{"docs":{},"函":{"docs":{},"数":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}},"已":{"docs":{},"经":{"docs":{},"使":{"docs":{},"用":{"docs":{},"的":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"r":{"docs":{},"y":{"docs":{},"数":{"docs":{},"量":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}},"可":{"docs":{},"用":{"docs":{},"的":{"docs":{},"总":{"docs":{},"量":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}},"开":{"docs":{},"始":{"docs":{},",":{"docs":{},"该":{"docs":{},"函":{"docs":{},"数":{"docs":{},"就":{"docs":{},"是":{"docs":{},"生":{"docs":{},"成":{"docs":{},"并":{"docs":{},"初":{"docs":{},"始":{"docs":{},"化":{"docs":{},"一":{"docs":{},"个":{"docs":{},"字":{"docs":{},"典":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}},"弹":{"docs":{},"出":{"docs":{},"栈":{"docs":{},"上":{"docs":{},"输":{"docs":{},"入":{"docs":{},"参":{"docs":{},"数":{"docs":{},"的":{"docs":{},"引":{"docs":{},"用":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}},"态":{"docs":{},",":{"docs":{},"当":{"docs":{},"有":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"找":{"docs":{},"到":{"docs":{},"对":{"docs":{},"应":{"docs":{},"的":{"docs":{},"值":{"docs":{},"并":{"docs":{},"讲":{"docs":{},"该":{"docs":{},"值":{"docs":{},"设":{"docs":{},"置":{"docs":{},"到":{"docs":{},"m":{"docs":{},"a":{"docs":{},"p":{"docs":{},"中":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"r":{"docs":{},"y":{"docs":{},"而":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},"为":{"docs":{},"空":{"docs":{},"则":{"docs":{},"返":{"docs":{},"回":{"docs":{},"n":{"docs":{},"o":{"docs":{},"t":{"docs":{},"f":{"docs":{},"o":{"docs":{},"u":{"docs":{},"n":{"docs":{},"d":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}}}}}},"正":{"docs":{},"常":{"docs":{},"值":{"docs":{},"则":{"docs":{},"讲":{"docs":{},"该":{"docs":{},"值":{"docs":{},"对":{"docs":{},"应":{"docs":{},"的":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"r":{"docs":{},"y":{"docs":{},"设":{"docs":{},"置":{"docs":{},"为":{"docs":{},"d":{"docs":{},"u":{"docs":{},"m":{"docs":{},"m":{"docs":{},"i":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}}}}}}}}},"新":{"docs":{},"建":{"docs":{},"并":{"docs":{},"初":{"docs":{},"始":{"docs":{},"化":{"docs":{},"一":{"docs":{},"个":{"docs":{},"字":{"docs":{},"典":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}},"申":{"docs":{},"请":{"docs":{},"内":{"docs":{},"存":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}},"的":{"docs":{},"内":{"docs":{},"存":{"docs":{},"置":{"docs":{},"空":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}},"查":{"docs":{},"找":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"一":{"docs":{},"个":{"docs":{},"可":{"docs":{},"用":{"docs":{},"的":{"docs":{},"h":{"docs":{},"a":{"docs":{},"s":{"docs":{},"h":{"docs":{},"位":{"docs":{},"置":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}},"该":{"docs":{},"值":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}},"检":{"docs":{},"查":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},"是":{"docs":{},"否":{"docs":{},"是":{"docs":{},"索":{"docs":{},"引":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}},"为":{"docs":{},"d":{"docs":{},"u":{"docs":{},"m":{"docs":{},"m":{"docs":{},"i":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}},"m":{"docs":{},"p":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"s":{"docs":{},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},"是":{"docs":{},"否":{"docs":{},"大":{"docs":{},"于":{"docs":{},"最":{"docs":{},"小":{"docs":{},"s":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}},"传":{"docs":{},"入":{"docs":{},"的":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},"是":{"docs":{},"否":{"docs":{},"h":{"docs":{},"a":{"docs":{},"s":{"docs":{},"h":{"docs":{},"为":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}},"数":{"docs":{},"量":{"docs":{},"是":{"docs":{},"否":{"docs":{},"超":{"docs":{},"过":{"docs":{},"最":{"docs":{},"大":{"docs":{},"值":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}},"在":{"docs":{},"新":{"docs":{},"建":{"docs":{},"的":{"docs":{},"过":{"docs":{},"程":{"docs":{},"中":{"docs":{},"是":{"docs":{},"否":{"docs":{},"通":{"docs":{},"过":{"docs":{},"参":{"docs":{},"数":{"docs":{},"传":{"docs":{},"值":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}},"如":{"docs":{},"果":{"docs":{},"不":{"docs":{},"是":{"docs":{},"u":{"docs":{},"n":{"docs":{},"i":{"docs":{},"c":{"docs":{},"o":{"docs":{},"d":{"docs":{},"e":{"docs":{},"则":{"docs":{},"直":{"docs":{},"接":{"docs":{},"调":{"docs":{},"用":{"docs":{},"l":{"docs":{},"o":{"docs":{},"o":{"docs":{},"k":{"docs":{},"d":{"docs":{},"i":{"docs":{},"c":{"docs":{},"t":{"docs":{},"方":{"docs":{},"法":{"docs":{},"查":{"docs":{},"找":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}}}}}}}},"为":{"docs":{},"d":{"docs":{},"u":{"docs":{},"m":{"docs":{},"m":{"docs":{},"y":{"docs":{},"并":{"docs":{},"且":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},"不":{"docs":{},"为":{"docs":{},"空":{"docs":{},"的":{"docs":{},"情":{"docs":{},"况":{"docs":{},"下":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}}}}},"是":{"docs":{},"否":{"docs":{},"为":{"docs":{},"空":{"docs":{},"如":{"docs":{},"果":{"docs":{},"任":{"docs":{},"一":{"docs":{},"为":{"docs":{},"空":{"docs":{},"则":{"docs":{},"报":{"docs":{},"错":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}},"d":{"docs":{},"u":{"docs":{},"m":{"docs":{},"m":{"docs":{},"i":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}},"u":{"docs":{},"n":{"docs":{},"i":{"docs":{},"c":{"docs":{},"o":{"docs":{},"d":{"docs":{},"e":{"docs":{},",":{"docs":{},"并":{"docs":{},"比":{"docs":{},"较":{"docs":{},"如":{"docs":{},"果":{"docs":{},"不":{"docs":{},"相":{"docs":{},"同":{"docs":{},"则":{"docs":{},"跳":{"docs":{},"转":{"docs":{},"到":{"docs":{},"f":{"docs":{},"o":{"docs":{},"u":{"docs":{},"n":{"docs":{},"d":{"docs":{},"_":{"docs":{},"a":{"docs":{},"c":{"docs":{},"t":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"可":{"docs":{},"用":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},"h":{"docs":{},"a":{"docs":{},"s":{"docs":{},"h":{"docs":{},"如":{"docs":{},"果":{"docs":{},"可":{"docs":{},"用":{"docs":{},"则":{"docs":{},"调":{"docs":{},"用":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"_":{"docs":{},"d":{"docs":{},"i":{"docs":{},"s":{"docs":{},"c":{"docs":{},"a":{"docs":{},"r":{"docs":{},"d":{"docs":{},"_":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},"r":{"docs":{},"y":{"docs":{},"方":{"docs":{},"法":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"报":{"docs":{},"错":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"是":{"docs":{},"分":{"docs":{},"离":{"docs":{},"表":{"docs":{},",":{"docs":{},"如":{"docs":{},"果":{"docs":{},"没":{"docs":{},"查":{"docs":{},"找":{"docs":{},"到":{"docs":{},"旧":{"docs":{},"值":{"docs":{},"并":{"docs":{},"且":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}},"字":{"docs":{},"典":{"docs":{},"类":{"docs":{},"型":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"2":{"docs":{},"的":{"docs":{},"倍":{"docs":{},"数":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"需":{"docs":{},"要":{"docs":{},"执":{"docs":{},"行":{"docs":{},"下":{"docs":{},"一":{"docs":{},"条":{"docs":{},"字":{"docs":{},"节":{"docs":{},"码":{"docs":{},"指":{"docs":{},"令":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}},"f":{"docs":{},"r":{"docs":{},"e":{"docs":{},"e":{"docs":{},"s":{"docs":{},"l":{"docs":{},"o":{"docs":{},"t":{"docs":{},"是":{"docs":{},"否":{"docs":{},"为":{"docs":{},"空":{"docs":{},"如":{"docs":{},"果":{"docs":{},"为":{"docs":{},"空":{"docs":{},"则":{"docs":{},"跳":{"docs":{},"转":{"docs":{},"到":{"docs":{},"f":{"docs":{},"o":{"docs":{},"u":{"docs":{},"n":{"docs":{},"d":{"docs":{},"_":{"docs":{},"u":{"docs":{},"n":{"docs":{},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"d":{"docs":{},"处":{"docs":{},"执":{"docs":{},"行":{"docs":{},"即":{"docs":{},"找":{"docs":{},"到":{"docs":{},"了":{"docs":{},"d":{"docs":{},"u":{"docs":{},"m":{"docs":{},"m":{"docs":{},"y":{"docs":{},"位":{"docs":{},"置":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"新":{"docs":{},"申":{"docs":{},"请":{"docs":{},"的":{"docs":{},"与":{"docs":{},"就":{"docs":{},"t":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{},"e":{"docs":{},"不":{"docs":{},"同":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}}}},"没":{"docs":{},"有":{"docs":{},"缓":{"docs":{},"存":{"docs":{},"可":{"docs":{},"使":{"docs":{},"用":{"docs":{},"的":{"docs":{},"字":{"docs":{},"典":{"docs":{},"则":{"docs":{},"申":{"docs":{},"请":{"docs":{},"内":{"docs":{},"存":{"docs":{},"生":{"docs":{},"成":{"docs":{},"一":{"docs":{},"个":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}},"测":{"docs":{},"试":{"docs":{},"代":{"docs":{},"码":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"然":{"docs":{},"后":{"docs":{},"编":{"docs":{},"译":{"docs":{},"运":{"docs":{},"行":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}},"状":{"docs":{},"态":{"docs":{},",":{"docs":{},"当":{"docs":{},"一":{"docs":{},"个":{"docs":{},"键":{"docs":{},"被":{"docs":{},"删":{"docs":{},"除":{"docs":{},"的":{"docs":{},"时":{"docs":{},"候":{"docs":{},",":{"docs":{},"这":{"docs":{},"只":{"docs":{},"会":{"docs":{},"在":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}},"现":{"docs":{},"在":{"docs":{},"我":{"docs":{},"们":{"docs":{},"动":{"docs":{},"手":{"docs":{},"观":{"docs":{},"看":{"docs":{},"一":{"docs":{},"下":{"docs":{},"具":{"docs":{},"体":{"docs":{},"的":{"docs":{},"操":{"docs":{},"作":{"docs":{},"实":{"docs":{},"例":{"docs":{},",":{"docs":{},"首":{"docs":{},"先":{"docs":{},"声":{"docs":{},"明":{"docs":{},",":{"docs":{},"该":{"docs":{},"例":{"docs":{},"子":{"docs":{},"仅":{"docs":{},"供":{"docs":{},"调":{"docs":{},"试":{"docs":{},"使":{"docs":{},"用":{"docs":{},",":{"docs":{},"目":{"docs":{},"前":{"docs":{},"调":{"docs":{},"试":{"docs":{},"的":{"docs":{},"字":{"docs":{},"典":{"docs":{},"的":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"生":{"docs":{},"成":{"docs":{},"h":{"docs":{},"a":{"docs":{},"s":{"docs":{},"h":{"docs":{},"调":{"docs":{},"用":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},"对":{"docs":{},"应":{"docs":{},"的":{"docs":{},"t":{"docs":{},"p":{"docs":{},"_":{"docs":{},"h":{"docs":{},"a":{"docs":{},"s":{"docs":{},"h":{"docs":{},"方":{"docs":{},"法":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},",":{"docs":{},"在":{"docs":{},"本":{"docs":{},"例":{"docs":{},"中":{"docs":{},"传":{"docs":{},"入":{"docs":{},"的":{"docs":{},"是":{"docs":{},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{},"类":{"docs":{},"型":{"docs":{},",":{"docs":{},"则":{"docs":{},"调":{"docs":{},"用":{"docs":{},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{},"类":{"docs":{},"型":{"docs":{},"的":{"docs":{},"t":{"docs":{},"p":{"docs":{},"_":{"docs":{},"h":{"docs":{},"a":{"docs":{},"s":{"docs":{},"h":{"docs":{},"方":{"docs":{},"法":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"第":{"docs":{},"一":{"docs":{},"个":{"docs":{},"值":{"docs":{},"为":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}},"缓":{"docs":{},"冲":{"docs":{},"池":{"docs":{},"没":{"docs":{},"有":{"docs":{},"则":{"docs":{},"申":{"docs":{},"请":{"docs":{},"新":{"docs":{},"的":{"docs":{},"对":{"docs":{},"象":{"docs":{},"并":{"docs":{},"初":{"docs":{},"始":{"docs":{},"化":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}},"表":{"docs":{},"。":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},"来":{"docs":{},"实":{"docs":{},"现":{"docs":{},"。":{"docs":{},"对":{"docs":{},"应":{"docs":{},"的":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}},"讲":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},"对":{"docs":{},"应":{"docs":{},"的":{"docs":{},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"u":{"docs":{},"e":{"docs":{},"设":{"docs":{},"置":{"docs":{},"为":{"docs":{},"空":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}},"生":{"docs":{},"成":{"docs":{},"的":{"docs":{},"m":{"docs":{},"a":{"docs":{},"p":{"docs":{},"压":{"docs":{},"栈":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"压":{"docs":{},"栈":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}},"不":{"docs":{},"为":{"docs":{},"空":{"docs":{},"并":{"docs":{},"且":{"docs":{},"不":{"docs":{},"为":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}},"设":{"docs":{},"置":{"docs":{},"m":{"docs":{},"a":{"docs":{},"_":{"docs":{},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"d":{"docs":{},"为":{"0":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},"docs":{}}}}}}}}},"为":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"找":{"docs":{},"到":{"docs":{},"的":{"docs":{},"值":{"docs":{},"(":{"docs":{},"这":{"docs":{},"也":{"docs":{},"是":{"docs":{},"字":{"docs":{},"典":{"docs":{},"查":{"docs":{},"找":{"docs":{},"的":{"docs":{},"核":{"docs":{},"心":{"docs":{},"逻":{"docs":{},"辑":{"docs":{},")":{"docs":{},"。":{"docs":{},"至":{"docs":{},"此":{"docs":{},",":{"docs":{},"字":{"docs":{},"典":{"docs":{},"的":{"docs":{},"插":{"docs":{},"入":{"docs":{},"的":{"docs":{},"大":{"docs":{},"致":{"docs":{},"流":{"docs":{},"程":{"docs":{},"已":{"docs":{},"经":{"docs":{},"分":{"docs":{},"析":{"docs":{},"完":{"docs":{},"毕":{"docs":{},"。":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"到":{"docs":{},"从":{"docs":{},"缓":{"docs":{},"冲":{"docs":{},"池":{"docs":{},"或":{"docs":{},"者":{"docs":{},"新":{"docs":{},"生":{"docs":{},"成":{"docs":{},"一":{"docs":{},"个":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}},"大":{"docs":{},"小":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"字":{"docs":{},"典":{"docs":{},"的":{"docs":{},"最":{"docs":{},"小":{"docs":{},"值":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}},"引":{"docs":{},"用":{"docs":{},"计":{"docs":{},"数":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"是":{"docs":{},"否":{"docs":{},"可":{"docs":{},"用":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"查":{"docs":{},"找":{"docs":{},"函":{"docs":{},"数":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"该":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},"对":{"docs":{},"应":{"docs":{},"的":{"docs":{},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"u":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}},"值":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}},"h":{"docs":{},"a":{"docs":{},"s":{"docs":{},"h":{"docs":{},"值":{"docs":{},"为":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},"与":{"docs":{},"h":{"docs":{},"a":{"docs":{},"s":{"docs":{},"h":{"docs":{},"值":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0013054830287206266}}}}}}}}}}},"新":{"docs":{},"的":{"docs":{},"s":{"docs":{},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}},"旧":{"docs":{},"的":{"docs":{},"m":{"docs":{},"a":{"docs":{},"s":{"docs":{},"k":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}},"该":{"docs":{},"为":{"docs":{},"v":{"docs":{},"a":{"docs":{},"l":{"docs":{},"u":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}},"字":{"docs":{},"典":{"docs":{},"对":{"docs":{},"象":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"函":{"docs":{},"数":{"docs":{},"的":{"docs":{},"主":{"docs":{},"要":{"docs":{},"工":{"docs":{},"作":{"docs":{},"就":{"docs":{},"是":{"docs":{},"查":{"docs":{},"找":{"docs":{},",":{"docs":{},"字":{"docs":{},"典":{"docs":{},"中":{"docs":{},"是":{"docs":{},"否":{"docs":{},"有":{"docs":{},"空":{"docs":{},"余":{"docs":{},"的":{"docs":{},"值":{"docs":{},",":{"docs":{},"或":{"docs":{},"者":{"docs":{},"如":{"docs":{},"果":{"docs":{},"找":{"docs":{},"到":{"docs":{},"了":{"docs":{},"满":{"docs":{},"足":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"主":{"docs":{},"要":{"docs":{},"就":{"docs":{},"是":{"docs":{},"做":{"docs":{},"了":{"docs":{},"检":{"docs":{},"查":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}},"检":{"docs":{},"查":{"docs":{},"传":{"docs":{},"入":{"docs":{},"的":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}},"输":{"docs":{},"出":{"docs":{},"的":{"docs":{},"字":{"docs":{},"节":{"docs":{},"码":{"docs":{},"如":{"docs":{},"下":{"docs":{},";":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},"所":{"docs":{},"示":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}},"返":{"docs":{},"回":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}},"。":{"docs":{},"继":{"docs":{},"续":{"docs":{},"查":{"docs":{},"看":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"初":{"docs":{},"始":{"docs":{},"化":{"docs":{},"完":{"docs":{},"成":{"docs":{},"的":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}},"返":{"docs":{},"现":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}},"0":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}},"首":{"docs":{},"先":{"docs":{},"会":{"docs":{},"调":{"docs":{},"用":{"docs":{},"相":{"docs":{},"关":{"docs":{},"的":{"docs":{},"查":{"docs":{},"找":{"docs":{},"方":{"docs":{},"法":{"docs":{},",":{"docs":{},"去":{"docs":{},"查":{"docs":{},"找":{"docs":{},"待":{"docs":{},"搜":{"docs":{},"索":{"docs":{},"的":{"docs":{},"值":{"docs":{},"是":{"docs":{},"否":{"docs":{},"已":{"docs":{},"经":{"docs":{},"存":{"docs":{},"在":{"docs":{},"字":{"docs":{},"典":{"docs":{},"中":{"docs":{},",":{"docs":{},"如":{"docs":{},"果":{"docs":{},"当":{"docs":{},"前":{"docs":{},"字":{"docs":{},"典":{"docs":{},"数":{"docs":{},"据":{"docs":{},"已":{"docs":{},"经":{"docs":{},"满":{"docs":{},"了":{"docs":{},"则":{"docs":{},"会":{"docs":{},"按":{"docs":{},"照":{"docs":{},"增":{"docs":{},"长":{"docs":{},"大":{"docs":{},"小":{"docs":{},"的":{"docs":{},"函":{"docs":{},"数":{"docs":{},"生":{"docs":{},"成":{"docs":{},"一":{"docs":{},"个":{"docs":{},"新":{"docs":{},"的":{"docs":{},"字":{"docs":{},"典":{"docs":{},",":{"docs":{},"并":{"docs":{},"把":{"docs":{},"旧":{"docs":{},"数":{"docs":{},"据":{"docs":{},"设":{"docs":{},"置":{"docs":{},"到":{"docs":{},"新":{"docs":{},"的":{"docs":{},"字":{"docs":{},"典":{"docs":{},"中":{"docs":{},",":{"docs":{},"当":{"docs":{},"找":{"docs":{},"到":{"docs":{},"的":{"docs":{},"字":{"docs":{},"典":{"docs":{},"匹":{"docs":{},"配":{"docs":{},"时":{"docs":{},"则":{"docs":{},"返":{"docs":{},"回":{"docs":{},"。":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},",":{"docs":{},"先":{"docs":{},"计":{"docs":{},"算":{"docs":{},"出":{"docs":{},"需":{"docs":{},"要":{"docs":{},"生":{"docs":{},"成":{"docs":{},"的":{"docs":{},"字":{"docs":{},"典":{"docs":{},"的":{"docs":{},"大":{"docs":{},"小":{"docs":{},",":{"docs":{},"然":{"docs":{},"后":{"docs":{},"再":{"docs":{},"初":{"docs":{},"始":{"docs":{},"化":{"docs":{},"一":{"docs":{},"个":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}}}}}}}}}}}}}},"讲":{"docs":{},"如":{"docs":{},"下":{"docs":{},"代":{"docs":{},"码":{"docs":{},"插":{"docs":{},"入":{"docs":{},"到":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}}}}},"d":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}},"h":{"docs":{},"a":{"docs":{},"s":{"docs":{},"h":{"docs":{},"值":{"docs":{},"也":{"docs":{},"相":{"docs":{},"同":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}}}}},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},"列":{"docs":{},"表":{"docs":{"objects/dict-object/":{"ref":"objects/dict-object/","tf":0.00045413260672116256}}}}}}},"?":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"也":{"docs":{},"是":{"docs":{},"基":{"docs":{},"于":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}},"先":{"docs":{},"获":{"docs":{},"取":{"docs":{},"旧":{"docs":{},"的":{"docs":{},"t":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}},"删":{"docs":{},"除":{"docs":{},"元":{"docs":{},"素":{"docs":{},",":{"docs":{},"调":{"docs":{},"用":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}},"右":{"docs":{},"移":{"docs":{},"5":{"docs":{},"位":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}},"向":{"docs":{},"字":{"docs":{},"典":{"docs":{},"中":{"docs":{},"添":{"docs":{},"加":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},";":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}},"并":{"docs":{},"依":{"docs":{},"次":{"docs":{},"对":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},"进":{"docs":{},"行":{"docs":{},"添":{"docs":{},"加":{"docs":{},"操":{"docs":{},"作":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}}}}},"支":{"docs":{},"持":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}},"最":{"docs":{},"小":{"docs":{},"的":{"docs":{},"拷":{"docs":{},"贝":{"docs":{},"数":{"docs":{},"组":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}},"申":{"docs":{},"请":{"docs":{},"该":{"docs":{},"元":{"docs":{},"素":{"docs":{},"的":{"docs":{},"内":{"docs":{},"存":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}},"索":{"docs":{},"引":{"docs":{},"值":{"docs":{},"*":{"5":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}},"docs":{}}}}},"继":{"docs":{},"续":{"docs":{},"查":{"docs":{},"看":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}},"计":{"docs":{},"算":{"docs":{},"下":{"docs":{},"一":{"docs":{},"个":{"docs":{},"索":{"docs":{},"引":{"docs":{},"值":{"docs":{},"继":{"docs":{},"续":{"docs":{},"寻":{"docs":{},"找":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}}}}},"完":{"docs":{},"成":{"docs":{},"后":{"docs":{},"添":{"docs":{},"加":{"docs":{},"值":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}},"索":{"docs":{},"引":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}},"集":{"docs":{},"合":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}},"(":{"docs":{},"s":{"docs":{},"e":{"docs":{},"t":{"docs":{},")":{"docs":{},"示":{"docs":{},"例":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}}}},"概":{"docs":{},"述":{"docs":{"objects/set-object/":{"ref":"objects/set-object/","tf":0.0006527415143603133}}}}}}},"length":3316},"corpusTokens":["!=","!pyunicode_checkexact(key))","\"","\"\"\"","\",","\".\"","\"base\",","\"cannot","\"combined\":","\"copyright\",","\"credits\"","\"help\",","\"int\",","\"int()","\"integer,","\"license\"","\"list","\"str\",","\"type\",","#","#22653)","#defin","#els","#endif","#if","#ifdef","#ifndef","%d","%d\\n\",","%ld","%ld\\n\",","&","&&","&=","&_parser,","&dk_entries(mp","&ep0[ix];","&int_info_desc)","&long_as_number,","&obase))","&old_value);","&old_value1);","&pydict_type);","&pylong_type)","&pylong_type);","&so","&table[i];","&v,","&x,","'%.200s'\",","'2'作为","'allocated'","'i","(","(!_pyarg_parsetupleandkeywordsfast(args,","(!initialized)","(!pydict_check(op))","(!pyfrozenset_check(anyset)","(!pylist_check(op))","(!pyset_check(anyset)","(!pyunicode_checkexact(key)","(!pyunicode_checkexact(key))","('1')","('2')","('e')","((base","((ix","((pyasciiobject","((pylistobject","((pyobject","((size_t)so","(*binaryfunc)(pyobject","(0)","(1)","(2)","(3)","(4)","(5)","(9","(;","(;;)","(_py_dec_reftot","(_py_decref_tmp)","(_pydict_hassplittable(mp)","(_pydict_hassplittable(mp))","(_pylong_on","(_pylong_zero","(abstract","(add)","(alloc","(and","(base","(binaryfunc)long_add,","(binaryfunc)long_mul,","(binaryfunc)long_rshift,","(binaryfunc)long_sub,","(cmp","(concret","(d)","(default,","(digit)abs(ival));","(digit)abs(ival);","(dk","(dk_indices).","(dk_indices):","(entri","(ep","(err","(freeslot","(hash","(hashfunc)","(hashfunc)long_hash,","(here","(i","(i*5","(inclusive)","(indexerr","(inquiry)long_bool,","(insertion_resize(mp)","(int","(int8_t*)(mp","(int_infotype.tp_nam","(is_oldtable_malloced)","(item","(iter","(ival","(ix","(ix1","(j=0;","(key_valu","(list_ass_slice(self,","(list_resize(self,","(long_to_decimal_string_internal(aa,","(m","(map","(minus","(mp","(n","(newitem","(newsiz","(newtabl","(none)","(not","(numfree)","(o","(obas","(old_valu","(op","(oparg","(opcode)","(pop)","(py_abs(py_size(a))","(py_type(mp)","(pydictobject","(pyindex_check(key))","(pylist_check(op)","(pylongobject","(pylongobject*","(pyobject","(pysetobject","(pystructsequence_inittype2(&int_infotype,","(python","(pyunicode_checkexact(startkey)","(remove)","(rv","(see","(set","(set_a)","(set_update_internal(so,","(sign","(size","(size_a","(size_t)hash","(size_t)hash;","(size_t)news","(size_t)py_ssize_t_max","(size_t)so","(so","(startkey","(type","(unaryfunc)long_abs,","(unaryfunc)long_invert,","(unaryfunc)long_long,","(unaryfunc)long_neg,","(union)","(update)","(v","(void)pyobject_init(v,","(w","(x","(x_add","(z",")",")ep01",")key1;","*","*)","*)(op))","*)(op);","*))","*));","*);","*)aa;","*)anyset,","*)mp);","*)mp,","*)mp;","*)null)","*)op)","*)op,","*)op;","*)so;","*)type","**)","**)pymem_realloc(self","**bytes_str)","**can**","**items;","**ma_values;","**ob_item;","**p;","**p_output,","**value_addr)","**values)","*,","*/","*_ob_next;","*_ob_prev;","*_py_decref_tmp","*a,","*a;","*aa)","*aa,","*anyset,","*args,","*b)","*bytes_writer,","*contain","*dk;","*entry;","*ep","*ep0","*ep01","*ep;","*fp,","*free_list[pylist_maxfreelist];","*freeslot;","*indic","*item","*iterable)","*key","*key)","*key,","*key;","*keys,","*kwargs)","*longobj","*m;","*ma_keys;","*map","*me_key;","*me_value;","*mp,","*mp;","*necessary*","*new_keys;","*new_keys_object(py_ssize_t","*newitem)","*newtable,","*o,","*ob_type;","*ob_type,它指向的类型对象就决定了一个对象是什么类型的。","*obas","*obase)","*obase);","*old_key;","*old_value;","*oldtable,","*op,","*op;","*pin,","*pout,","*return_valu","*scratch,","*self,","*set","*so,","*so;","*startkey","*str","*sub","*table,","*table;","*temp","*tmpkey;","*tp_as_async;","*tp_as_map","*tp_as_mapping;","*tp_as_mapping的分析与pynumbermethod","*tp_as_numb","*tp_as_number;","*tp_as_sequ","*tp_as_sequence;","*tp_name;","*type,","*v","*v)","*v,","*v;","*valu","*value)","*value_addr","*w)","*weakreflist;","*writer,","*x","*x,","*z;","+",".","...","......","./configur","/","/*","/*[clinic","/*nb_add","/*nb_add*/","/*nb_and","/*nb_divmod","/*nb_float*/","/*nb_int*/","/*nb_invert","/*nb_lshift","/*nb_multipli","/*nb_multiply*/","/*nb_neg","/*nb_or","/*nb_power","/*nb_remaind","/*nb_reserved*/","/*nb_rshift","/*nb_subtract","/*nb_subtract*/","/*nb_xor","/*tp_absolut","/*tp_bool","/*tp_posit","//","0","0)","0);","0){","0,","03","0412。","0;","0xff,","0};","1","1)","1))","1);","1,","1,2,所以会在执行字节码指令的时候,执行","1/2","10","10.0.17134.0,","1024;","1060","11","12","128","14","15","16","16,","16:17:57)","18","19:36:27","1;","1]不为零,这与普通四则运算的加法运算相同,只不过进位单元不同而已","1:github","2","2)","2).","2**(shift*i)","2,","2.","2/3","20","20000","20000,是根据代码找到相关的","2003","2017","2019","2019,","2020","21","22","23","24","25","25,","257","257)","26","28","2]","2:python","3","3)","3);","3,","3.6","3.7","3.7.0","3.7.0.tar.xz","3.7.3","3.7m","3/5","30","30,否则","31","32","34","35,","36)","37","370/","38","3]","4","4,","41","44","46,","47","4]","5","5,","50","51","54","57","58,","6","60","63","64","66","67","7","7.3.0]","70","72,","73","76","79","8","8)","8,","80","82","85","86","88,","89","9","9223372043297226753",":",":\");",":0",";","=","==",">",">=",">>",">>=",">>>",">alloc",">allocated;",">dk_indices);",">dk_indices[0],",">dk_lookup",">dk_lookup(mp,",">dk_nentri",">dk_nentries)))",">dk_nentries);",">dk_nentries++;",">dk_nentries]",">dk_nentries];",">dk_refcnt",">dk_size",">dk_size);",">dk_size;",">dk_usabl",">fill",">fill*5",">fill++;",">finger",">hash",">hash)",">hash);",">key",">key,",">key;",">ma_key",">ma_keys);",">ma_keys)[ix].me_valu",">ma_keys)[mp",">ma_keys,",">ma_us",">ma_used);",">ma_used++;",">ma_used;",">ma_valu",">ma_values)",">ma_values[ix]",">ma_values[mp",">ma_version_tag",">mask",">mask;",">me_hash",">me_key",">me_key));",">me_key,",">me_valu",">me_value;",">mp_ass_subscript(o,",">mp_ass_subscript)",">ob_digit[0]",">ob_digit[0]);",">ob_digit[i]",">ob_digit[i])",">ob_digit[i];",">ob_item",">ob_item,",">ob_item;",">ob_refcnt",">ob_refcnt++)",">ob_typ",">smalltable;",">sq_ass_item)",">tabl",">table;",">table[i];",">tp_alloc(type,",">tp_as_mapping;",">tp_as_sequ",">tp_as_sequence)",">tp_hash(object);",">use",">used)",">used);",">used*2",">used*4);",">used++;",">used;",">used>50000",">weakreflist",">“配置”中仅勾选","?","@classmethod","[","[0,","[1,","[]","[clinic","[gcc","[x]","\\","]","__eq__,","_dictkeysobject","_keywords,","_keywords[]","_longobject","_object","_parser","_py_check_refcnt(_py_decref_tmp)","_py_count_allocs_comma","_py_dealloc(_py_decref_tmp);","_py_hot_funct","_py_inc_reftot","_py_inc_tpallocs(op)","_py_newreference((pyobject","_py_newreference(op)","_py_ref_debug_comma","_pyarg_pars","_pybyteswrit","_pydict_newpresized((py_ssize_t)oparg);","_pydict_newpresized(py_ssize_t","_pylong_init(void)","_pylong_new(size_a);","_pylong_on","_pylong_zero","_pyobject_extra_init","_pyobject_gc_track(op);","_pyobject_head_extra","_pyunicode_eq(startkey,","_pyunicodewrit","_typeobject","_typeobject代码","a;","abs(ob_size)","abs_ival;","absolut","accommod","aclocal.m4","activ","active:当","actual","add","addit","alloc","allocated/2","alway","amort","anymore.","anything.","anyway","aol","api","api。例如整数对象,我们可以利用如下的","app1","app1((pylistobject","app1(pylistobject","appends()","apt","arbitrari","aren't","argument\");","array","assert","assert(","assert(_pydict_checkconsistency(mp));","assert(borrow","assert(ep","assert(is_power_of_2(size));","assert(ix","assert(key","assert(key);","assert(minus","assert(mp","assert(newt","assert(old_valu","assert(oldt","assert(pyunicode_checkexact(ep","assert(pyunicode_checkexact(key)","assert(s","assert(self","assert(startkey","assert(value);","assign","assignment\",","avoid","a、b","b","b);","b;","base","base;","bash)的交互式程序提供了行编辑和历史功能","be:","befor","behavior","bigger","bin","binari","binaryfunc","bininstal","bit","borrow","borrow;","build_map","build_set","bypass","bzip2","c","c++中的","c++来编写自定义模块扩展","cach","calc_hash","calc_hash(pyobject*","call","call_funct","call_method","can't","carri","carry;","cater","chang","char","check_binop(a,","check_small_int","check_small_int(ival)","check_small_int(ival);","checkout","class","clean","clone","cmp","cmp;","code","code:","code]*/","col","combin","common.h","comparison","comparison_error:","compatibility)","compil","config.guess","config.sub","configur","configure.ac","const","consum","contain","container[sub]","convert","copi","copyright","count","count;","count_alloc","cours","cpython2","cpython3","creat","current","d","d.pop('1')","d;","d['1']='2'","d['1']='e'","d[10]","d[1]","d[2]","d[3]","d[5]","d[7]","d[9]","data","dealloc","debian/ubuntu,执行:","debug、32","defin","del","destructor","dev","devel","di","dict","dict_ass_sub","dict_ass_sub(pydictobject","dict_lookup_func","dict_next_version();","dict_test.pi","dictionari","dictionaries)与联合字典(combin","dictkeysobject","dictobject.c","dictonaries)。详细的信息可查看有关","differ","digit","discard_found;","discard_notfound;","dispatch();","dk","dk;","dk_debug_incref","dk_decref(keys);","dk_entries(mp","dk_entries,","dk_entries.","dk_get_index(mp","dk_lookup","dk_lookup;","dk_mask(mp","dk_nentries;","dk_refcnt;","dk_set_index(mp","dk_size","dk_size;","dk_usable;","dkix_dummy(","dkix_dummy);","dkix_empti","dkix_empty(","dkix_empty)","dkix_empty;","dkix_error","dkix_error)","dkix_error.","dk,最后进行申请到的内存讲内容清空。接着就会进行","do","doc","docker","doesn't","don't","dummi","dummies,","dummy)","dummy);","dummy:先前保存了一个","dummy;","dummy,并且将","dummy;set_discard_key","d,从输出信息可知,index","e.g.,","each","elements.","empti","empty,","enabl","end","enough","ensur","enter","entri","entries*/","entries.","entries;","entry;","enum","ep","ep01++;","equal","err","err;","error;","es","es,","estimate_size(minused);","etc.","exception.","exception;","exit:","exit;","fail","fail:","fail;","fall","fast","faster","field","file","fill","fill;","fill==size,","find","finger","finger;","fit","fix","flaggo","flags)","float","format","formerli","found","found_active:","found_active;","found_null:","found_null;","found_unused:","found_unused;","found_unused_or_dummy:","found_unused_or_dummy;","free","free_list[","free_values(values);","freeslot","frequent","frozenset","function","fundament","further","gcc","gdbm","gener","get_small_int(sdigit","getattrfunc","getattrofunc","git","gitbook该文件修订时间:","github","give","give;","global","gnu","gnu”","go","goto","grammar","growth","growth.","guarante","half","handl","hash","hash)","hash);","hash,","hash1","hash1,","hash;","hashfunc","hashpos,","hash值为","hash,便于查找,set","hash,如果能够被","help","here.","hold","http://localhost:4000","https://github.com/python/cpython.git","https://www.python.org/downloads/release/python","https://www.python.org/ftp/python/3.7.0/python","i)","i);","i+1,","i+1;","i,","i;","i=0","if)","implement","includ","include/dictobject.h","include/object.h","inclusive).","increment","index","index>=0","indexerr","indexerr);","indexing,","indic","information.","init","initi","input=2dc2ba5bb2fb1f82]*/","input=81c98f418af9eb6f]*/","input]","ins1","ins1((pylistobject","ins1(pylistobject","insert","insertdict","insertdict()","insertdict(mp,","insertdict(pydictobject","insertion.","instal","instanc","instead","int","int\");","int'","int.__new__","int8_t","int_info","integ","integers.","intern","intrins","invariants:","is:","is_oldtable_malloc","is_oldtable_malloced;","issu","it,","item","item);","items;","items[i+1]","items[i];","items[where]","iterable))","iterable);","ival","ival)","ival,","ix","ix)","ix1","ix;","j;","jme_key;","k_mul","karatsuba","keep","key","key)","key))","key)))","key);","key,","key,value,每一个","key1","key1,","key;","key_valu","key_value,","key_value;","keys,","keys;","keys_free_list[","keys。当出现一个事件将字典的属性值进行改变的时候,个别字典将慢慢的转化成组合表的形式。这就保证了在大部分的应用场景下很高的内存利用效率,并保证了在各个场景下的正确性。当","keys,valu","key。接下来就详细分析一下相关流程。","key。操作字典如下所示;","kind;","known","kwargs,","larg","larger","largest","layer)","layout","len(set),和","lib","lib/python3.7/config","libbz2","libffi","libgdbm","libpython3.7m.a,该静态库用于使用","libreadline6","libsqlite3","libssl","libuuid","licens","linear","linear_prob","linux","list","list\");","list.","list[0]","list_remov","list_remove(pylistobject","list_remove函数会遍历列表,使用pyobject_richcomparebool与目标值进行比较,","list_remove函数,","list_res","list_resize(pylistobject","listobject.c","listobject.h","load_attr","load_const","load_method","load_nam","long","long_add","long_add(pylongobject","long_and,","long_as_numb","long_dealloc,","long_div,","long_divmod,","long_doc,","long_float,","long_getset,","long_long,","long_lshift,","long_methods,","long_mod,","long_mul(pylongobject","long_new","long_new(pytypeobject","long_new,","long_new_impl","long_new_impl(pytypeobject","long_new_impl(type,","long_norm","long_normalize(z);","long_or,","long_pow,","long_richcompare,","long_subtype_new(type,","long_to_decimal_string(pyobject","long_to_decimal_string,","long_to_decimal_string_internal(pyobject","long_to_decimal_string_internal中添加如下代码并重新编译安装","long_true_divide,","long_xor,","longintrepr.h","longobj","longobject.h","lookdict()","lookdict():","lookdict(mp,","lookdict);","lookdict;","lookdict_split():","lookdict_unicod","lookdict_unicode()","lookdict_unicode():","lookdict_unicode_nodummy():","lookdict_unicode_nodummy(pydictobject","lookdict_unicode_nodummy;","lookdict_unicode_nodummy;","lookup","lower","lst","lst.append(1)","lst.remove(3)","lst[0]","lst[3]","m","m4","ma_key","ma_keys,","ma_keys.","ma_used;","ma_valu","ma_version_tag;","mac","macos,执行:","maintain_tracking(mp,","make","make_new_set(&pyset_type,","make_new_set(pytypeobject","makefile.pre.in","malloc","malloc'","map","mask","mask,","mask;","math、hashlib","max_pres","max_presize;","me_hash;","me_key.","me_valu","meaning","medium","memcpy(small_copy,","memori","memoryerror.","memset(&dk","memset(dk_entries(dk),","memset(newtable,","method","mild,","minsiz","minus","minused)","minused.","misc","miss","modifi","modul","more","mp","mp_ass_subscript","multipl","n","n)","n+1)","n;","nb_floor_divid","nb_index","nb_inplace_add","nb_inplace_and","nb_inplace_floor_divid","nb_inplace_lshift","nb_inplace_matrix_multiply;","nb_inplace_multipli","nb_inplace_or","nb_inplace_pow","nb_inplace_remaind","nb_inplace_rshift","nb_inplace_subtract","nb_inplace_true_divid","nb_inplace_xor","nb_matrix_multiply;","nb_true_divid","ndigit","necessari","need","needed.","neg","negative;","neutral","never","new","new_alloc","new_allocated,","new_allocated;","new_dict","new_dict(pydictkeysobject","new_keys_object","newitem);","newmask","newmask,","newmask;","newsiz","newsize)","newsize);","newsize.","newsize;","newtabl","newtable;","node","non","note:","npm","nsmallnegint","nsmallnegints;","nsmallposint","nsmallposints];","null","null)","null))","null);","null,","null;","null_error();","null};","num","num_allocated_byt","num_allocated_bytes);","num_allocated_bytes;","number","numer","numfre","numfree];","numfreekeys];","o","o);","ob_base;","ob_digit","ob_digit),","ob_digit[0]","ob_digit[1]","ob_digit[2]","ob_digit[abs(ob_size)","ob_digit[i]","ob_digit[i])","ob_digit[i];","ob_digit[index]);","ob_item","ob_item[0],","ob_item[i],","ob_item[i];","ob_refcnt","ob_refcnt;","ob_siz","ob_size.","ob_size;","ob_size不会改变allocated。","ob_size,确保","ob_typ","obas","obase);","obase:","object","object(c_default=\"null\")","object)","object/longobject.c","objects/abstract.c","objects/clinic/longobject.c.h","objects/dict","objects/dictobject.c","objects/listobject.c","objects/longobject.c","objects/typeobject.c","objects/unicodeobject.c","offsetof(pylongobject,","old","old_key","old_valu","old_value1;","oldmask","oldtabl","oldtable)","oldtable);","oldtable,","oldtable;","on","op","op;","oparg);","oparg;","openssl","oper","order","organ","os","os。","out","output","output=e47cfe777ab0f24c","output=f087e1951a5e30d1","over","over,","over;","overalloc","overflow","overrid","p","parser","part","path","pattern","pc","pcbuild","pcbuild\\pcbiuld.sln","peek(2*i","peek(2*i);","peek(i);","pend","pending:索引>=0,键!=空,值=空(仅拆分),尚未插入到拆分表中。","pending。","perform","perturb","perturb)","perturb;","perturb_shift;","perturb设置为当前hash值","point","pointer","poorli","pop","pop()","pop_top","possibl","power","pre","prealloc","prefix=","presenc","present.","preserv","prevent","previou","print","print(1)","print(lst[3])","print(num)","printf(\"%","printf(\"\\n\");","printf(\"found","printf(\"indic","printf(\"ob_s","printf(\"siz","printf(\"valu","printfunc","printing,","proce","program","propag","proport","purg","purpose,","push(map);","push(set);","py_abs(py_size(a)),","py_abs(py_size(b));","py_atexit(show_alloc);","py_decref(container);","py_decref(item);","py_decref(key);","py_decref(map);","py_decref(old_key);","py_decref(op)","py_decref(op);","py_decref(pop());","py_decref(set);","py_decref(so);","py_decref(startkey);","py_decref(sub);","py_decref(v);","py_decref(value);","py_decref将调用该对象的tp_dealloc来释放对象所占用的内存和系统资源;","py_eq);","py_hash_t","py_incref(key);","py_incref(op)","py_incref(op)与py_decref(op)","py_incref(startkey);","py_incref(v);","py_incref(value);","py_refcnt(anyset)","py_refcnt(op)","py_return_none;","py_size(a));","py_size(op)","py_size(op))","py_size(self)","py_size(self);","py_size(v)","py_ssize_t","py_ssize_t_max","py_ssize_t_max)","py_tpflags_basetyp","py_tpflags_default","py_tpflags_long_subclass,","py_trace_ref","py_unreachable();","py_xdecref(newitem);","py_xdecref(old_value);","py_xsetref(*p,","pyasyncmethod","pybytearray/pybyt","pyconfig.h.in","pydict_delitem((pyobject","pydict_delitem,设置一个","pydict_minsize);","pydict_minsize;","pydict_setitem((pyobject","pydict_setitem(map,","pydict_setitem(pyobject","pydict_setitem;","pydictentri","pydictkeyentri","pydictkeyentry;","pydictkeysobject","pydictkeysobject;","pydictkeysobject,最后就生成一个","pydictobject","pydictobject;","pyerr_badinternalcall();","pyerr_nomemory();","pyerr_occurred())","pyerr_setobject(pyexc_indexerror,","pyerr_setstring(pyexc_indexerror,","pyerr_setstring(pyexc_overflowerror,","pyerr_setstring(pyexc_typeerror,","pyerr_setstring(pyexc_valueerror,","pyexc_indexerror);","pyintobject","pylist_append","pylist_append(pyobject","pylist_get_size(self);","pylist_getitem","pylist_getitem(pyobject","pylist_insert","pylist_insert(pyobject","pylist_maxfreelist","pylist_new","pylist_new(py_ssize_t","pylist_setitem","pylist_setitem(pyobject","pylistobject","pylistobject对象的一些操作","pylistobject缓冲池默认大小为80","pylong_fromlong","pylong_fromlong(0);","pylong_fromlong(0l);","pylong_fromlong(1);","pylong_fromlong(10);","pylong_fromlong(20000);","pylong_fromlong(long","pylong_fromlong,就不一一列举了","pylong_fromstr","pylong_fromunicodeobject,最终调用","pylong_mask;","pylong_shift","pylong_shift.","pylong_shift;","pylong_typ","pylong_type中tp_as_number.nb_add","pylongobject","pylongobject*","pylongobject*,那么它会调用","pylongobject;","pymappingmethod","pymem_calloc(size,","pymem_del(oldtable);","pymem_new(setentry,","pynumber_asssize_t(key,","pynumber_asssize_t(obase,","pynumber_long","pynumber_long(x);","pynumbermethod","pynumbermethods;","pyobject","pyobject*","pyobject;","pyobject_del,","pyobject_gc_new(pydictobject,","pyobject_genericgetattr,","pyobject_hash(key);","pyobject_hash(key1);","pyobject_head","pyobject_head_init(type)","pyobject_malloc(sizeof(pydictkeysobject)","pyobject_new(pyobject,","pyobject_print","pyobject_print(pyobject","pyobject_print(str,","pyobject_richcomparebool(startkey,","pyobject_setitem","pyobject_setitem(container,","pyobject_setitem(pyobject","pyobject_var_head","pysequence_setitem(o,","pysequencemethod","pyset_add(pyobject","pyset_add(set,","pyset_add,该函数的本质与","pyset_mins","pyset_minsize)","pyset_minsize;","pyset_minsize默认我8,mask为7","pyset_new","pyset_new(null);","pyset_new(pyobject","pysetobject","pysetobject;","python","python/ceval.c","pythoncore,然后点击“确定”(如下图所示)。","python,右键选择“生成”,以进行编译:","python,输入","python,那么就需要用到这里提供的头文件。","pytype_typ","pytype_type创建的","pytypeobject","pytypeobject;","pytypeobjet","pyunicod","pyunicode_checkexact(key)","pyunicode_fromstr","pyunicode_fromstring(","pyunicode_fromstring(\"i","pyunicode_kind","pyunicode_typ","pyunicodeobject","pyunicodeobject*,那么就会调用","pyvarobject","pyvarobject;","pyvarobject_head_init(&pytype_type,","pyvarobject也是基于pyobject扩展的。","pyvarobject,而","quick_int_allocs++;","quick_int_allocs,","quick_neg_int_allocs++;","quick_neg_int_allocs;","rais","rang","range\");","re","readlin","readme.rst","realloc()","realloc().","reason","rebuild","redhat/centos/fedora,执行:","refcount","refer","regist","releas","rem,","remov","repeat","repres","representation.","reprfunc","reserved,pow","resiz","resize.","restart:","restart;","return","return_valu","return_value;","reus","reveal","rich","right","roadmap","room","run","runtim","rv","rv;","s","s.add(1)","s.add(2)","s.add(7)","save","scanner","scheme","sdk","sdk,如下图所示:","search","searches.","second();","see","select","self","sequenc","serv","set","set,","set_a","set_a.add(3)","set_a.add(3)本质都调用了更底层","set_a.add(4)","set_a.remove(1)","set_a.union({1,5})","set_a.update({3,})","set_add_entri","set_add_entry(pysetobject","set_add_entry(so,","set_add_key","set_add_key((pysetobject","set_add_key(pysetobject","set_discard_entri","set_discard_entry(pysetobject","set_discard_entry(so,","set_discard_key","set_discard_key(pysetobject","set_discard_key(so,","set_insert_clean(newtable,","set_insert_clean(setentri","set_lookkey","set_lookkey(so,","set_lookkey该方法与插入的逻辑类似大家可自行查看","set_remove()函数上,如下示例;","set_remove(pysetobject","set_table_res","set_table_resize(pysetobject","set_test.pi","setattrfunc","setattrofunc","setentri","setentry;","setup.pi","set。作为一个无序的集合,set","set,扩充的原则就是如果当前的","sh","share","shared.","show_alloc_count","shrink","shrinking,","sign","sign;","similar","singl","size","size)","size);","size,","size;","size_a","size_a,","size_b","size_count","size_count,","size_t","size_t.","sizeof(digit),","sizeof(pydictkeyentry)","sizeof(pyheaptypeobject),","sizeof(pymemberdef),","sizeof(pyobject","sizeof(setentry)","sizeof(small_copy));","size,检查是否超过设置的大小,检查是否有缓存的字典数据可用,如果没有则申请内存重新生成一个","slot","slots,","small","small_copy;","small_copy[pyset_minsize];","small_ints;","small_ints[nsmallnegint","smaller.","smallest","smalltabl","smalltable[pyset_minsize];","space","special","speed","spill","split","splitted:","sqlite","sqlite3","stackadj(","standard","start","startkey","startkey)","state","static","stdout,","store","store_nam","store_subscr","str;","strict","string","strlen,","struct","studio","sub,","subclass","subtle:","subtract","sudo","suit","sum(for","support","sure","switch","system","t;","tabl","table.","table;","tables.","table。如果从","table,如果重置大小作为保存实例属性的结果,并且只有一个该","table,它们的键表都被缓存在类型属性中,并且允许所有该类型的实例都可以共享该","tarbal","target(build_map)","target(build_set)","target(store_subscr)","temp;","tenpow;","termin","ternaryfunc","terribl","tests.","that'","third();","those","through","time","tk","tool","top();","tp_alloc","tp_as_buff","tp_as_map","tp_as_numb","tp_as_sequ","tp_base","tp_basics","tp_basicsize,","tp_call","tp_call;","tp_clear","tp_compar","tp_dealloc","tp_dealloc;","tp_descr_get","tp_descr_set","tp_dict","tp_dictoffset","tp_doc","tp_flag","tp_free","tp_getattr","tp_getattr;","tp_getattro","tp_getattro;","tp_getset","tp_hash","tp_hash*/","tp_hash;","tp_init","tp_items","tp_itemsize;","tp_iter","tp_iternext","tp_member","tp_method","tp_name","tp_name,","tp_new","tp_print","tp_print;","tp_repr","tp_repr;","tp_reserv","tp_richcompar","tp_setattr","tp_setattr;","tp_setattro","tp_setattro;","tp_str","tp_str;","tp_travers","tp_weaklistoffset","two","two:","type","type_error(\"'%.200s'","type_error(\"sequ","typedef","uint64_t","unicod","unicode_eq(ep","unicode_hash,","unicode_hash函数","union","unique,","unix","unix/linux","unsign","unus","unused:没有插入任何一个获取的","up","updat","us","usabl","usable);","usable;","usable_fraction(max_presize))","usable_fraction(size);","used;","used>50000","uuid","v","v);","v,","v3.7.0","v;","valu","value);","value,","value.","value;","value_addr);","values;","values是否需要加入垃圾回收","value。","value,它不会删除","value,并且在此之前也没有存储任何的","variabl","vector","veri","version","version:","virgin","visual","void","w);","we'r","weak","wget","where,","where;","wiki","wimp","window","without","won't","x","x,","x:","x_add","x_add(pylongobject","x_sub","x_sub(pylongobject","x_sub)","xcode","xxx","xz","y","yacc","yum","z","zlib","zlib1g","{","{\"\",","{\"|oo:int\",","{1,2}","{20000:2}","{platform}","{}","|","||","}","},","};","©","“darwin”,在","“x86_64","└──","├──","一个","一个数的绝对值等价于下面的表达式","一个用于垃圾回收的双向链表,一个引用计数变量","一个类型对象指针ob_typ","一些对象属性","一些整数在一开始就会被初始化一直留存,当再次使用直接从小整数对象池中获取,不用频繁的申请内存。","一堆方法定义,函数和指针","上为","上可执行:","上方便的获取,执行:","上进行编译和开发","下图是对象运行时的图像表现","不为空并且","不为空的时候出现。","不为空,保存了一个键值对,activ","不会改变为一个","不同的发行版,安装方式和包名称也不尽相同。","不支持","不记录元素位置或者插入点。因此,set","与","与hash求和的mask","与操作","与普通四则运算减法相同,数不够大则向高一位借位,","与类型相关的","与该类型对象相关的操作信息(如","且","中删除一个","中大量采用了内存对象池的技术,使得对象释放的空间归还给内存池而不是直接free,后续使用可先从对象池中获取","中定义了大量的函数指针。这些函数指针可以视为类型对象中","中对应的该值,而只是将","中打印对象的接口:","中提供了几个有用的宏:","中添加内容时;","中的","中的原生字符数组转换为出","中的字符串(unicode)对象","中的所有对象都拥有一些相同的内容,而这些内容就定义在pyobject中,","中的每个东西都是一个对象,","中通常已具备","中,主要通过","中,在一个","中,如果相同则不插入,如果索引对应的值且值不同,则遍历从该索引往后9个位置的值,依次找到有空余位置的值,并将该值设置进去。如果设置该值之后使用的数量占总的申请数量超过了","中,对应的","中,此时查看该执行函数;","中,每一个对象都将自己的引用计数、类型信息保存在开始的部分中。","中;","为","为了方便对这部分内存初始化,python","为了避免频繁的申请内存空间,创建pylistobject的时候会先检查缓冲池是否有可用空间","为8","主要依靠","主要就是通过传入的","主要是检查是否","主要用于","之后,","之间,如果超过这个阈值则字典就会自动扩容,扩容的策略大家可详细查看源码。","乘法","也是基于","二进制可执行文件的源码。","亦可执行:","介绍","从","从app1代码可以看出追加元素操作大致流程如下","从ins1代码可以看出插入元素操作大致流程如下","从代码中可以看出pyvarobject比pyobject多出了一个用于存储元素个数的变量ob_size。","从源码可以看出","从该函数的执行可知,初始化的函数是从_pydict_newpres","从输出内容可知,字典的大小随之改变了,这也说明了","代表平台,比如在","以pylong_type为例,可以清晰的看到一般的类型对象和pytype_type之间的关系","以下是","会根据保存的元素自动调整大小。相关的内存布局如下;","会检查传入的数是否在小整数范围内,如果是直接返回。","会被里面切换到","会调用","但是fill数量未变","但这并不意味着最终一定会调用","位。","位数的一半。","位系统中,pylong_shift","位,您也可以根据自己的需求调整成","使用","使用个数加1","使用加1","使用总数加1","使用数加1","使用数量减1","使用的keys个数","使用缓冲池对象","便利ma_key","保存key","保存数据的数组","保存数据的数组数组指针","保存计算得出的hash值","修改","值与","值减1,此处没有减去","值,me_valu","值,因为字典也被","值,如果计算出的索引值,没有值,则直接将该值存入对应的","偏移","做处理","做进位处理,然后处理","元素赋值","元素赋值的示例","先获取旧的tabl","內建函数与{}生成的字典,模块和大部分其他字典都会创建为","其中","其中为什么初始化的时候输入","其中就调用了字典的","其中的","其中,me_hash","其中,pydictkeysobject","其中:","其他情况则需要调用pymem_realloc函数分配新的空间存储列表元素。","其公式为","其存储结构如下图","具体可以看","具体实现在","内存申请失败则返回为空","内存管理机制","内建对象","内部会用","内部各个函数之间传递的都是一种范型指针","内部调试用","再执行本节开头处的命令即可。","决定的,64","决定的,那么类型对象的类型是由谁决定的呢?","减少该对象引用","减法","减法运算函数","函数","函数list_resize就是用于调节list存储空间大小的","函数可以看出有如下几种情况","函数实现中的前","函数将值加入到","函数是一种快速乘法","函数来实现;","函数的执行流程;","函数的执行过程;","函数的指针是一个","函数调整","函数进行处理设置值;","函数;","分成位数较少的数,每个数都是原来","列表allocated的增长模式是","则什么也不做","则将转换好的字符串对象打印至我们指定的标准输出(stdout)","则直接返回,如果能被","则继续调用","则设置freeslot","则该类型对象不支持设置","则调用","则重新扩充","创建","创建pylistobject","创建一个对象比如","创建对象","创建对象有两种方式","创建整数对象","创建该类型对象分配的内存空间大小","创建该类型对象时分配的空间大小信息,即","初始化为空;","初始化代码中看到绑定的是long_hash函数","初始化数据;","初始化的时候都为0","初始化的时候,就输出如上所示内容;我们接下来继续操作;","初始化的状态。","删除元素,调用","判断不能为空","判断缓冲池是否有","到","到底长什么样。","前置条件","前言","前通常需要在系统上安装以下库:","前面我们提到了pyobject","前面提到,在","加上","加法","加法运算函数","加1与mask求余获取下一个索引值","动态进行判断,而","包含","包含以下文件(夹):","包括创建对象需要分配多少内存,对象都支持哪些操作等等。","包括已经使用的entry与空entry值的总和","包括所有曾经申请过的数量。","即可查看本书内容。","即可获取","压缩、解压相关库","压缩库","压缩解压工具","又细分为两个函数","及之后的版本可以使用微软的","双向链表","反汇编获取该脚本的字节码;","反转","发行版可能会有较多的库未安装,除了安装上一小节提及的库外,其他缺失库可根据情况自行安装:","取余","变量来维护这个对象,其他对象也与此类似","变量,这个变量维护对象的引用计数,从而最终决定该对象的创建与销毁","变长对象都拥有一个相同的内容","只保留了","可以在创建或复制整数对象等函数中找到","可以看出,创建一个整数对象的入口函数为","可以看到整数对象的数值操作较多,由于篇幅限制无法一一分析,这里只分析整数的部分操作","可以看到整数的加法运算函数","可以转变为","可完全通过界面操作,主要分为两个步骤:","可用减1","可用的entry数量","可知,删除一个","可知,该命令就是讲'1'作为","可见这个变化不是一蹴而就的,有比较艰辛的过程,大家有兴趣可以去挖掘一下","右移5位","合法性检查","向字典中添加key;","命令为:","命令去构建","命令的方式构建:","命令,或想直接使用","命令,执行如下命令进行初始化:","命令,简单执行如下命令进行初始化:","和","和执行引擎部分,是","哈希查找函数","图形用户界面开发工具","在","在python中的list可以存放任何类型的数据,查看pylistobject可以发现,list实际存放的是pyobject*","在pytypeobject的代码中,我们还可以看到非常重要的三组操作族","在下载完成后,需要注意安装环节的选项。由于","在以下代码中可以看出pylong_type中的tp_as_number项指向的是long_as_numb","在初始化的时候都会处于这种状态,并且","在左侧的解决方案目录中选择","在左侧的解决方案目录的顶端,右键选择“属性”,以打开属性界面(如下图所示)。","在开始我们的学习之旅之前,我们要先认识一个结构体pyobject,可以说","在指定目录中:","在接下来研究源码的过程中,我们可能会对某些语句的逻辑感到好奇,需要输出中间结果。","在本例的初始化过程中,由于传入了初始值","在源代码中","在类型机制中至关重要,所有用户自定义","在线版,或者根据以下步骤访问本地版。","在运行时需要的所有的内部使用对象的实现。","垃圾回收","域","基本的原理和做法是将位数很多的两个大数","多线程机制","大于","大体按照《python","大致的","如pyobject_new。创建一个整数对象的方式","如下图所示","如果key相同","如果key相同则跳转到found_active处执行","如果mp的ma_values有值","如果set改变了则重新开始查找","如果不为空则保存的是valu","如果不相同则重置fill为used的值","如果不能hash","如果不能hash则返回","如果两个表相同则删除旧tabl","如果为空则申请内存失败报错","如果为空则证明找到一个可以使用的","如果为空则跳转值found_null设置key与hash","如果为空则跳转到found_nul","如果传递给","如果使用的与曾经使用的数量相同","如果使用的相同则什么都不做","如果值不为空则插入到新的table中","如果已使用的总数大于3/5则重新调整table,如果set使用的总数超过了50000则扩展为以前的2倍否则就是四倍","如果当前hash值相等","如果找到为空则直接跳转到found_unused_or_dummy处","如果找到了该值","如果找到则跳转到found_act","如果找到当前hash为空或者key为空的则跳转到found_unused_or_dummy处执行","如果找到的hash值相同","如果找到的值与传入需要设置的值相同则跳转到found_active处执行","如果指针是一个","如果新建失败则报错","如果是unicode,通过类型转换检查两个key的内容是否相同,如果不相同则跳转到found_active处","如果是其他类型的对象则调用比较方法去比较两个key是否相同","如果是分离的","如果有则是保存的keys数据","如果有设置该类型","如果有迭代器","如果比较失败则返回","如果没有找到则获取下一个索引值","如果没有找到则返回-1","如果没有找到,则获取当前table的头部节点","如果相同","如果获取的新大小与pyset_minsize的大小相同","如果获取索引的值没有被使用则直接跳转到found_unused处执行","如果错误就报错处理","如需重新编译,请首先执行:","字典","字典对象操作","字典对象是通过","字典最大的容量","字典概述","字典的两种类型","字典的初始化流程","字典的插入与查找","字典的操作测试","字典的最佳大小容量限定在","字典示例","字典,一个","字典,该字典的行为方式与最初的字典的行为方式大致相同。","字符串","存放的是","存放的是可执行文件","存放的是帮助等文件","安全套接字层密码库,linux","安装在特定目录,则需要在一开始修改","安装项目依赖:","宏","官方网站","定义了一个数值对象该支持的操作。一个数值对象如","定义开始有一个宏pyoject_var_head,查看源码可知","定长对象与变长对象","实现了多态机制","实现简版","实际绑定的是","实际调用的就是","容器的相关数据结构","容纳其他对象的序列集合对象","对","对于","对于其他对象,可以通过与其关联的类型对象确定其类型,那么通过什么来确定一个对象是类型对象呢?","对于初学者来说这么多类型的对象怎么学?别着急,我们后续章节会解答。","对应的","对应的方法,在初始化之后对应的是","对象","对象:","对象上,","对象初探","对象对应的类型对象中定义的","对象机制的基石","对象的分类","对象的创建","对象的变化过程中,entri","对象的多态性","对象的大致的一个分类","对象的类型是由该对象指向的","对象的行为","对象的高位数字,最后使用","对象类型指针struct","对象赋值","对象都是通过","对象除了前面提到的那种分类方法外,还可以分为定长对象和变长对象这两种形式。","对象,最后返回。至此,dict","将会被编译,并安装在默认目录中。若您希望将","将传入初始化的参数传入","将保存数据的头指针指向tabl","将元素插入list尾部","将元素插入指定位置","将内容更新到so中","将数据拷贝到set_lookkey中","将申请的内存置空","将要插入的位置的元素都往后移一个位置","将该key设置为dummi","将该值赋值","小型的数据库系统","小整数初始化","小整数对象","就对应一个","就指定了它进行加法操作时的具体行为。","就是","就是保存的数据的","就是保存的数据,hash","就是哈希生成的值,me_key","就是对应的","就是对应的值。","就是根据","就是记录了","就表示该处未使用。","就进行两倍扩充否则就进行四倍扩充。","已经使用可用的总量","已经使用的entry数量","希望各位","常规操作系统中","并依次对set进行添加操作","序列对象操作","序章","建立联系的。","开始,该函数就是生成并初始化一个字典;","异或","引用计数","弹出栈上输入参数的引用","当","当删除的时候,dummi","当我们继续向","当被创建的字典是用来保存","态,当有","您可以直接访问","您的系统上需要安装好","我们不知道这个指针所指的对象是什么类型,只能通过所指对象的","或","或其它类序列的操作。","或操作","或称为","或者","或者使用","所","所以在","所以来的用于支持","所以需要选择安装该","所使用的","所依赖的必要环境)","所定义的操作,这些操作直接决定着一个对象在运行时所表现出的行为,比如","所对应的","执行下一条指令","执行如下命令运行服务端:","扩展的库","找到entry而key为空则返回notfound","找到对应的值并讲该值设置到map中","找到正常值则讲该值对应的entry设置为dummi","指令,初始化完成之后,就调用","指向类型对象的指针,决定了对象的类型","指明了该类型对象如何生成其hash值。","指针","接下来我们看","接下来我们看一下struct","提供的所有头文件,如果用户需要自己用","提高key的引用计数","插入元素","插入到","插入的概述如下,默认","插入,这就是","操作tp_hash,tp_hash可以在pytypeobject中找到,","操作库","操作,查看源码可以看到","支持","数值中移除了该","数值对象","数值对象操作","数组的低位开始依次按位相加,carri","整数对象","整数对象的数值操作","整数对象,那么它的类型对象","整数的存储结构","整数相乘","整数相加","新建并初始化一个set","新建并初始化一个字典","新申请内存","新申请的内存置空","方式","方法删除一个","方法如下;","方法就是将生成的方法,插入到字典中去;","方法来讲对应的","方法添加元素,调用","方法,此时就是调用","方法;","方法;此时我们分析一下,dict","时,list_resize只会改变","时,me_key","时,会分配内存进行初始化,然后","是一个变长对象","是一个软件库,它为使用命令行界面(如","是动态链接(libpython3.7m.so),则需要在一开始修改configur","是变长对象","是否可用","是否有缓存,如果有缓存就选择缓存中的dk","是否能够被","是怎么与","是无序且不重复的集合,是可变的,通常用来从列表中删除重复项以及计算数学运算,如交集、并集、差分和对称差分等集合操作。set","是由","是静态链接(libpython3.7m.a)。如果希望编译的","更多关于在","更多内容","更多标准操作","最小的拷贝数组","有","本次示例脚本如下:","本项目致力于对","来保存数据值的;","来创建一个新的字典,接着就对新建的字典","来合并集合。接下来就详细分析一下相关的操作流程。","来增加和减少对一个对象的引用计数。当一个对象的引用计数减少到","来实现数据的,详情如下;","来更新集合,通过","查找","查找一个可用的hash位置","查找该值","标准库","标准类方法集","根据","根据索引返回对应的元素","根据经验在1/2和2/3之间效果最好","检查freeslot是否为空如果为空则跳转到found_unused处执行即找到了dummy位置","检查key是否为dummi","检查key是否是索引","检查mp","检查size是否大于最小s","检查传入的key是否hash为","检查传入的数量是否超过最大值","检查在新建的过程中是否通过参数传值","检查如果不为dummy并且key不为空的情况下","检查如果不是unicode则直接调用lookdict方法查找","检查新申请的与就table不同","检查是否为dummi","检查是否为unicode,并比较如果不相同则跳转到found_act","检查是否为空如果任一为空则报错","检查是否可用","检查是否可用hash如果可用则调用set_discard_entry方法","检查是否报错","检查是否是分离表,如果没查找到旧值并且","检查是否是字典类型","检查是否是2的倍数","检查是否需要执行下一条字节码指令","模块加载机制","正是通过","此后我们一直添加值进","此外,默认情况下的编译设置是","此时基本的流程就是通过传入的","此时就会调用","此时就是查找该值,如果找到该值并将该值设置为","此时继续查看","此时,从栈中取出相关参数,并将这些值传入","比如,我们希望在解释器交互界面中打印整数值的时候输出一段字符串,则我们可以修改如下函数:","求bool值","求幂","没有缓存可使用的字典则申请内存生成一个","注:这里的","测试代码","添加打印代码","源代码下载","源代码可以在","源代码就从这里开始(本书将采用","源代码的组织","源代码进行词法分析和语法分析的部分。除此以外,此目录还包含了一些有用的工具,这些工具能够根据","源文件","源文件:include/dict","源文件:include/dictobject.h","源文件:include/listobject.c","源文件:include/listobject.h","源文件:include/longintrepr.h","源文件:include/longobject.h","源文件:include/object.h","源文件:include/setobject.h","源文件:objects/abstract.c","源文件:objects/clinic/longobject.c.h","源文件:objects/dictobject.c","源文件:objects/listobject.c","源文件:objects/longobject.c","源文件:objects/longobject.h","源文件:objects/object.c","源文件:objects/setobject.c","源文件:objects/typeobject.c","源文件:objects/unicodeobject.c","源文件:python/ceval.c","源码","源码剖析》中的目录结构进行编写。依次介绍","源码剖析》,编写","源码包。","源码基本信息、内建对象和虚拟机。","源码根目录,打开","源码根目录,执行以下命令:","源码的头文件","然后编译运行;","爱好者能参与其中,一起探索","版本的代码。","版的","状态,当一个键被删除的时候,这只会在","环境下编译","环境准备","环境准备(准备","现在我们动手观看一下具体的操作实例,首先声明,该例子仅供调试使用,目前调试的字典的","生成hash调用key对应的tp_hash方法","生成hash调用key对应的tp_hash方法,在本例中传入的是str类型,则调用str类型的tp_hash方法","用于把","由","由于我们只是研究","申请该元素的内存","的","的__dict__属性时,该字典才会创建为一个","的世界一切皆对象,不论是整数,还是字符串,甚至连类型、函数等都是一种对象。","的代码如下","的位置不能被重新使用,一旦发生碰撞,探针序列就无法知道这对键值对曾是活跃的键值对。","的值插入到新表中;","的值的存储是通过结构","的值,然后判断是否","的关联对象","的内容见官方指南","的内建对象,包括整数、list、dict","的创建与初始化","的创建工作已经完成。","的删除","的删除操作主要集中在","的反汇编工具获取字节码;","的大小必须是2的倍数","的字典中,一个键值对的对应保存就是","的字典就是实现了一个","的字典类型中包含了两种,分离字典(split","的定义中包含许多信息,主要分类以下几类:","的定义如下;","的实例,字典会立马再变为一个","的对象机制就是基于pyobject拓展开来的,所以我们先看看pyobject","的工程文件,研究","的执行效率。因此","的执行流程可知,字典的初始化过程就是初始化相关数据结构。","的执行流程;","的描述pep","的插入","的插入过程执行完毕。","的操作基本如上所述。","的操作系统中","的数据结构如下;","的数量,从此处可知,fill","的整数对象","的方法集。此时就调用了","的方法集,并调用了该方法集的","的核心部分,可以选择不编译标准库和外部依赖,在“配置属性”","的检查,此时如果可用","的源码分析,深度参考陈儒大大的《python","的版本。","的版本为","的状态会在不同的状态间转换。基本上在如下四种状态中转换:unused、active、dummi","的示例图如下,注:pylong_shift","的第三行有这么一句话","的算法主要是用于两个大数的乘法,极大提高了运算效率,相较于普通乘法降低了复杂度,并在其中运用了递归的思想。","的索引值,","的虚拟机执行函数如下;","的虚拟机执行函数;","的身影,以下只列出了","的键值对,但是这个键值对被删除了并且一个活跃的键值对还没有填入该位置,dummi","目录","目录下则是存放一些对速度没有太严格要求的模块,比如","目录结构","目录:包含了","目录:包含了所有","目录:包含了所有用","直接讲value设置到entry上面","直接设置ma_values对应的ix到values中","直接访问","直接通过","相关数据结构的内存布局为;","相同则调用list_ass_slice进行移除,当遍历完列表还未找到则报错","相同并且需要重新","相同的就将","相同,大家可以自行查阅源码","相同,如果相同则全部插入,如果不同,则遍历旧","确保","示例","示例脚本如下:","移动弹栈","移除元素","移除元素示例","章节","第一个值为key","等。同时,该目录还包括了","等。它们都是那些对速度要求非常严格的模块。而相比而言,lib","答案就是","算法的实现","类似","类型名","类型名,","类型对象","类型并且不能","类型数据,set","类型来保存;","类型的类型","索引值*5","绝对值","继续查看","缓冲池没有则申请新的对象并初始化","编写的小型数据库","编译","编译、安装","编译安装后进入","编译工具","编译结束后,生成的文件存放在pcbuild\\win32目录下(如下图所示),打开python_d即可打开新生成的","编译结果","考虑以下的","而具体赋值绑定我们可以在","自带的所有标准库,且都是用","自身实现的结构中引用了多次,所以我们就设置了一个特殊值来跟踪我们想要的字典;当","若您不能使用","若您可使用","范型","获取keys的首个元素地址","获取so","获取下一个位置","获取下一个元素","获取传入值的hash值","获取作为队列的操作集","获取元素","获取元素的示例","获取大小","获取存取的地址","获取当前entri","获取当前key","获取新table的地址","获取新的mask","获取最小的值,在新建一个空的字典的时候该值为0","获取生成的最终的值","获取类型的tp_as_mapping方法集","获取索引对应的值","获取该位置元素值","获取该值","虚拟机","虚拟机一般表达式","虚拟机函数机制","虚拟机在运行时内部使用的对象","虚拟机控制流","虚拟机框架","行为我们加入的代码,其中:","行;","表。","表来实现。对应的","解决方案,而后进行一些设置:","解释器。","解释器中的","解释器输入如下代码","计算下一个索引值继续寻找","计算完成后添加值","计算索引","讲key对应的value设置为空","讲set压栈","讲不为空并且不为","讲生成的map压栈","设置hash值为","设置key与hash值","设置ma_used为0","设置为","设置为找到的值(这也是字典查找的核心逻辑)。至此,字典的插入的大致流程已经分析完毕。","设置到从缓冲池或者新生成一个","设置大小","设置字典的最小值","设置引用计数","设置新的size","设置旧的mask","设置是否可用","设置查找函数","设置该key对应的valu","设置该值","访问","该为valu","该为字典对象","该函数主要就是做了检查","该函数主要就是检查传入的","该函数的主要工作就是查找,字典中是否有空余的值,或者如果找到了满足","语句即可看到我们希望的结果:","语言的词法和语法分析器,与","语言的语法自动生成","语言编写的。","语言编写的模块,比如","语言进行扩展。{platform}","调整list大小","调整list存储空间","调用","调用_pylong_frombytes,最终调用","调用key本身的方法比较","调用list_resize,将list大小加一","调用了","调用查找方法","调用索引插入","调用该mp_ass_subscript方法","调用该方法设置值","跨平台的开源的","较为简单,主要分为两个步骤:","输出的字节码如下所示;","输出的字节码如下;","运行于","运行环境初始化","运行的核心所在。","运行编译后的","返回","返回。继续查看","返回初始化完成的set","返回返现","返回0","这两个宏","这两种类型,","这些宏在各种内建类型对象的初始化中被大量使用。","这就需要借助","这是一个非常重要的结构体,它不仅仅决定了一个对象的类型,还包含大量的元信息,","这样处理之后,简化为做三次乘法,并附带少量的加法操作和移位操作。","这样的函数指针)","这类","这里","进入","进入源码目录,我们可以看到该目录下主要","进行了赋值操作与更新操作,最后调用了","进行编译)。","进行编译,选择社区版就足够了。","追加元素","通常只能作用于某一种类型的对象上,对于每一种内建对象","通常形如pyobject_xxx这样的形式。可以应用在任何","通过","通过传入的hash与mask求索引下标","通过字节码指令可知,首先调用了","通过字节码的指令","通过引用计数来管理维护对象在内存中的存在与否","通过查找","通过该字节码指令可知,创建","逻辑右移","逻辑左移","部分,即对","都不为","都提供了这样一组","都是","都有ob_refcnt","释放内存空间。因为频繁的申请、释放内存会大大降低","重新插入该列表该值","重新改变大小,它会立马改变为一个","重新进行编译,在","重置table指向新t","随着list元素的减少,list的存储空间可能存在冗余,这个时候就需要缩小list的存储空间。","随着list元素的增加,list的存储空间可能会不够用,这个时候就需要扩大list的存储空间。","集合","集合(set)示例","集合概述","需要用到","非常类似。","首先会调用相关的查找方法,去查找待搜索的值是否已经存在字典中,如果当前字典数据已经满了则会按照增长大小的函数生成一个新的字典,并把旧数据设置到新的字典中,当找到的字典匹配时则返回。","首先,先计算出需要生成的字典的大小,然后再初始化一个","首先,讲如下代码插入到","魔法背后的奥秘!","默认初始化为8个元素,通过table指向","默认情况下,编译的","默认的小整数范围是","(会自带npm)。",",下拉至页面最下方,可选择下载",",通过描述可知,python","d","hash值也相同","key列表"],"pipeline":["stopWordFilter","stemmer"]},"store":{"./":{"url":"./","title":"前言","keywords":"","body":"介绍\n本项目致力于对 Python 3.7 的源码分析,深度参考陈儒大大的《Python 源码剖析》,编写 Python 3 的版本。\n希望各位 Python 爱好者能参与其中,一起探索 Python 魔法背后的奥秘!\n使用\n您可以直接访问 在线版,或者根据以下步骤访问本地版。\n前置条件\n您的系统上需要安装好 node (会自带npm)。\n使用 make 或者使用 npm 命令去构建\n使用 make 命令的方式构建:\n若您可使用 make 命令,简单执行如下命令进行初始化:\nmake init\n\n执行如下命令运行服务端:\nmake run\n\n使用 npm 命令的方式构建:\n若您不能使用 make 命令,或想直接使用 npm 命令,执行如下命令进行初始化:\n安装项目依赖:\nnpm install\n\n执行如下命令运行服务端:\nnpm run serve\n\n访问\n直接访问 http://localhost:4000 即可查看本书内容。\nRoadmap\n大体按照《Python 源码剖析》中的目录结构进行编写。依次介绍 Python 源码基本信息、内建对象和虚拟机。\n\n[x] 章节\n[x] 序章\n[x] 前言\n[x] Python 源代码的组织\n[x] Windows 环境下编译 Python\n[x] UNIX/Linux 环境下编译 Python\n[x] 修改 Python 源码\n\n\n[ ] Python 内建对象\n[x] Python 对象初探\n[x] Python 整数对象\n[ ] Python 字符串 对象\n[x] Python List 对象\n[x] Python Dict 对象\n[x] Python Set 对象\n[ ] 实现简版 Python\n\n\n[ ] Python 虚拟机\n[ ] Python 编译结果\n[ ] Python 虚拟机框架\n[ ] 虚拟机一般表达式\n[ ] Python 虚拟机控制流\n[ ] Python 虚拟机函数机制\n[ ] Python 运行环境初始化\n[ ] Python 模块加载机制\n[ ] Python 多线程机制\n[ ] Python 内存管理机制\n\n\n\nCopyright © FlagGo 2019 all right reserved,powered by Gitbook该文件修订时间:\n2020-03-23 19:36:27\n"},"preface/code-organization/":{"url":"preface/code-organization/","title":"Python 源代码的组织","keywords":"","body":"Python 源代码的组织\n源代码下载\n方式 1:GitHub\nPython 源代码可以在 GitHub 上方便的获取,执行:\ngit clone https://github.com/python/cpython.git\ngit checkout v3.7.0\n\n即可获取 Python 3.7.0 版本的代码。\n方式 2:Python 官方网站\n访问 https://www.python.org/downloads/release/python-370/ ,下拉至页面最下方,可选择下载 tarball 源码包。\n亦可执行:\nwget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz\n\n即可获取 Python 3.7.0 版本的代码。\n目录结构\n进入源码目录,我们可以看到该目录下主要 包含以下文件(夹):\n.\n├── Doc\n├── Grammar\n├── Include\n├── LICENSE\n├── Lib\n├── Mac\n├── Makefile.pre.in\n├── Misc\n├── Modules\n├── Objects\n├── PC\n├── PCbuild\n├── Parser\n├── Programs\n├── Python\n├── README.rst\n├── Tools\n├── aclocal.m4\n├── config.guess\n├── config.sub\n├── configure\n├── configure.ac\n├── install-sh\n├── m4\n├── pyconfig.h.in\n└── setup.py\n\n其中:\nInclude 目录:包含了 Python 提供的所有头文件,如果用户需要自己用 C 或 C++来编写自定义模块扩展 Python,那么就需要用到这里提供的头文件。\nLib 目录:包含了 Python 自带的所有标准库,且都是用 Python 语言编写的。\nModules 目录:包含了所有用 C 语言编写的模块,比如 math、hashlib 等。它们都是那些对速度要求非常严格的模块。而相比而言,Lib 目录下则是存放一些对速度没有太严格要求的模块,比如 os。\nParser 目录:包含了 Python 解释器中的 Scanner 和 Parser 部分,即对 Python 源代码进行词法分析和语法分析的部分。除此以外,此目录还包含了一些有用的工具,这些工具能够根据 Python 语言的语法自动生成 Python 语言的词法和语法分析器,与 YACC 非常类似。\nObjects 目录:包含了所有 Python 的内建对象,包括整数、list、dict 等。同时,该目录还包括了 Python 在运行时需要的所有的内部使用对象的实现。\nPython 目录:包含了 Python 解释器中的 Compiler 和执行引擎部分,是 Python 运行的核心所在。\nPCbuild 目录:包含了 Visual Studio 2003 的工程文件,研究 Python 源代码就从这里开始(本书将采用 Visual Studio 2017 对 Python 进行编译)。\nPrograms 目录:包含了 Python 二进制可执行文件的源码。\nCopyright © FlagGo 2019 all right reserved,powered by Gitbook该文件修订时间:\n2020-03-23 19:36:27\n"},"preface/windows-build/":{"url":"preface/windows-build/","title":"Windows 环境下编译 Python","keywords":"","body":"Windows 环境下编译 Python\n在 Windows 环境下编译 Python 可完全通过界面操作,主要分为两个步骤:\n\n环境准备\n编译\n\n环境准备\n在 Python 3.6 及之后的版本可以使用微软的\nVisual Studio 2017 进行编译,选择社区版就足够了。\n在下载完成后,需要注意安装环节的选项。由于 Python 3.7 所使用的 Windows SDK 的版本为 10.0.17134.0,\n所以需要选择安装该 SDK,如下图所示:\n\n编译\n进入 Python 源码根目录,打开 PCbuild\\pcbiuld.sln 解决方案,而后进行一些设置:\n在左侧的解决方案目录的顶端,右键选择“属性”,以打开属性界面(如下图所示)。\n\n由于我们只是研究 Python 的核心部分,可以选择不编译标准库和外部依赖,在“配置属性”->“配置”中仅勾选\npython 和 pythoncore,然后点击“确定”(如下图所示)。\n此外,默认情况下的编译设置是 Debug、32 位,您也可以根据自己的需求调整成 Release 或 64 位。\n\n在左侧的解决方案目录中选择 python,右键选择“生成”,以进行编译:\n\n编译结束后,生成的文件存放在PCbuild\\win32目录下(如下图所示),打开python_d即可打开新生成的 Python 3.7 解释器。\n\n更多内容\n更多关于在 Windows 上进行编译和开发 Python 的内容见官方指南\nCopyright © FlagGo 2019 all right reserved,powered by Gitbook该文件修订时间:\n2020-03-23 19:36:27\n"},"preface/unix-linux-build/":{"url":"preface/unix-linux-build/","title":"UNIX/Linux 环境下编译 Python","keywords":"","body":"UNIX/Linux 环境下编译 Python\n在 UNIX/Linux 环境下编译 Python 较为简单,主要分为两个步骤:\n\n环境准备(准备 Python 所依赖的必要环境)\n编译、安装\n\n环境准备\n常规操作系统中\n编译 Python 前通常需要在系统上安装以下库:\n\ngcc // 编译工具\nzlib // 压缩、解压相关库\nlibffi // Python 所以来的用于支持 C 扩展的库\nopenssl // 安全套接字层密码库,Linux 中通常已具备\n\n不同的发行版,安装方式和包名称也不尽相同。\n对于 Debian/Ubuntu,执行:\nsudo apt install -y zlib1g zlib1g-dev libffi-dev openssl libssl-dev\n\n对于 RedHat/CentOS/Fedora,执行:\nyum install -y zlib zlib-devel libffi-devel openssl openssl-devel\n\n对于 macOS,执行:\nxcode-select --install\n\n运行于 Docker 的操作系统中\nDocker 版的 Linux 发行版可能会有较多的库未安装,除了安装上一小节提及的库外,其他缺失库可根据情况自行安装:\n\nbzip2 // 压缩库\nreadline // GNU Readline 是一个软件库,它为使用命令行界面(如 Bash)的交互式程序提供了行编辑和历史功能\nsqlite // 由 C 编写的小型数据库\nlibuuid // 跨平台的开源的 uuid 操作库\ngdbm // 小型的数据库系统\nxz // 压缩解压工具\ntk-devel // 图形用户界面开发工具\n\n对于 Debian/Ubuntu,执行:\nsudo apt-get install bzip2 libbz2-dev sqlite3 libsqlite3-dev libreadline6 libreadline6-dev libgdbm-dev uuid-dev tk-dev\n\n对于 RedHat/CentOS/Fedora,执行:\nyum install bzip2 bzip2-devel readline-devel sqlite-devel libuuid-devel gdbm-devel xz-devel tk-devel\n\n编译、安装\n进入 Python 源码根目录,执行以下命令:\n./configure\nmake\nmake install\n\nPython 将会被编译,并安装在默认目录中。若您希望将 Python 安装在特定目录,则需要在一开始修改 configure 命令为:\n./configure --prefix=\n\n在指定目录中:\n\nbin 目录 存放的是可执行文件\ninclude 目录 存放的是 Python 源码的头文件\nlib 目录 存放的是 Python 标准库\nlib/python3.7/config-3.7m-{platform} 目录 存放的是 libpython3.7m.a,该静态库用于使用 C 语言进行扩展。{platform} 代表平台,比如在 Mac OS 上为 “darwin”,在 Linux 上为 “x86_64-linux-gnu”\n\n\nshare 目录 存放的是帮助等文件\n\n默认情况下,编译的 Python 是静态链接(libpython3.7m.a)。如果希望编译的 Python 是动态链接(libpython3.7m.so),则需要在一开始修改configure 命令为:\n./configure --enable-shared\n\n如需重新编译,请首先执行:\nmake clean\n\n再执行本节开头处的命令即可。\nCopyright © FlagGo 2019 all right reserved,powered by Gitbook该文件修订时间:\n2020-03-23 19:36:27\n"},"preface/modify-code/":{"url":"preface/modify-code/","title":"修改 Python 源码","keywords":"","body":"修改 Python 源码\n在源代码中 Print\n在接下来研究源码的过程中,我们可能会对某些语句的逻辑感到好奇,需要输出中间结果。\n这就需要借助 Python C API 中打印对象的接口:\n源文件:Objects/object.c\nint\nPyObject_Print(PyObject *op, FILE *fp, int flags)\n\n比如,我们希望在解释器交互界面中打印整数值的时候输出一段字符串,则我们可以修改如下函数:\n源文件:Objects/longobject.c\nstatic PyObject *\nlong_to_decimal_string(PyObject *aa)\n{\n PyObject *str = PyUnicode_FromString(\"I am always before int\");\n PyObject_Print(str, stdout, 0);\n printf(\"\\n\");\n\n PyObject *v;\n if (long_to_decimal_string_internal(aa, &v, NULL, NULL, NULL) == -1)\n return NULL;\n return v;\n}\n\n函数实现中的前 3 行为我们加入的代码,其中:\n\nPyUnicode_FromString 用于把 C 中的原生字符数组转换为出 Python 中的字符串(Unicode)对象\nPyObject_Print 则将转换好的字符串对象打印至我们指定的标准输出(stdout)\n\n对 Python 重新进行编译,在 Unix 上可执行:\nmake && make bininstall\n\n运行编译后的 Python,输入 print 语句即可看到我们希望的结果:\n>>> print(1)\n'I am always before int'\n1\n\nCopyright © FlagGo 2019 all right reserved,powered by Gitbook该文件修订时间:\n2020-03-23 19:36:27\n"},"objects/object/":{"url":"objects/object/","title":"Python 对象初探","keywords":"","body":"Python 对象初探\n在 Python 的世界一切皆对象,不论是整数,还是字符串,甚至连类型、函数等都是一种对象。\n对象的分类\n以下是 Python 对象的大致的一个分类\n\nFundamental 对象: 类型对象\nNumeric 对象: 数值对象\nSequence 对象: 容纳其他对象的序列集合对象\nMapping 对象: 类似 C++中的 map 的关联对象\nInternal 对象: Python 虚拟机在运行时内部使用的对象\n\n\n对象机制的基石 PyObject\n对于初学者来说这么多类型的对象怎么学?别着急,我们后续章节会解答。\n在开始我们的学习之旅之前,我们要先认识一个结构体PyObject,可以说 Python 的对象机制就是基于PyObject拓展开来的,所以我们先看看PyObject 到底长什么样。\n源文件:Include/object.h\n// Include/object.h\n#define _PyObject_HEAD_EXTRA \\\n struct _object *_ob_next; \\\n struct _object *_ob_prev;\n\ntypedef struct _object {\n _PyObject_HEAD_EXTRA // 双向链表 垃圾回收 需要用到\n Py_ssize_t ob_refcnt; // 引用计数\n struct _typeobject *ob_type; // 指向类型对象的指针,决定了对象的类型\n} PyObject;\n\nPython 中的所有对象都拥有一些相同的内容,而这些内容就定义在PyObject中,\nPyObject 包含 一个用于垃圾回收的双向链表,一个引用计数变量 ob_refcnt 和 一个类型对象指针ob_type\n\n定长对象与变长对象\nPython 对象除了前面提到的那种分类方法外,还可以分为定长对象和变长对象这两种形式。\n变长对象都拥有一个相同的内容 PyVarObject,而 PyVarObject也是基于PyObject扩展的。\n从代码中可以看出PyVarObject比PyObject多出了一个用于存储元素个数的变量ob_size。\n源文件:Include/object.h\n// Include/object.h\ntypedef struct _object {\n _PyObject_HEAD_EXTRA\n Py_ssize_t ob_refcnt;\n struct _typeobject *ob_type;\n} PyObject;\n\ntypedef struct {\n PyObject ob_base;\n Py_ssize_t ob_size; /* Number of items in variable part */\n} PyVarObject;\n\n\n类型对象\n前面我们提到了PyObject 的 对象类型指针struct _typeobject *ob_type,它指向的类型对象就决定了一个对象是什么类型的。\n这是一个非常重要的结构体,它不仅仅决定了一个对象的类型,还包含大量的元信息,\n包括创建对象需要分配多少内存,对象都支持哪些操作等等。\n接下来我们看一下struct _typeobject代码\n在 PyTypeObject 的定义中包含许多信息,主要分类以下几类:\n\n类型名, tp_name, 主要用于 Python 内部调试用\n创建该类型对象时分配的空间大小信息,即 tp_basicsize 和 tp_itemsize\n与该类型对象相关的操作信息(如 tp_print 这样的函数指针)\n一些对象属性\n\n源文件:Include/object.h\n// Include/object.h\ntypedef struct _typeobject {\n PyObject_VAR_HEAD\n const char *tp_name; /* For printing, in format \".\" */ // 类型名\n Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */\n // 创建该类型对象分配的内存空间大小\n\n // 一堆方法定义,函数和指针\n /* Methods to implement standard operations */\n destructor tp_dealloc;\n printfunc tp_print;\n getattrfunc tp_getattr;\n setattrfunc tp_setattr;\n PyAsyncMethods *tp_as_async; /* formerly known as tp_compare (Python 2)\n or tp_reserved (Python 3) */\n reprfunc tp_repr;\n\n /* Method suites for standard classes */\n // 标准类方法集\n PyNumberMethods *tp_as_number; // 数值对象操作\n PySequenceMethods *tp_as_sequence; // 序列对象操作\n PyMappingMethods *tp_as_mapping; // 字典对象操作\n\n // 更多标准操作\n /* More standard operations (here for binary compatibility) */\n hashfunc tp_hash;\n ternaryfunc tp_call;\n reprfunc tp_str;\n getattrofunc tp_getattro;\n setattrofunc tp_setattro;\n\n ......\n\n} PyTypeObject;\n\n类型的类型\n在 PyTypeObjet 定义开始有一个宏PyOject_VAR_HEAD,查看源码可知 PyTypeObjet 是一个变长对象\n源文件:Include/object.h\n// Include/object.h\n#define PyObject_VAR_HEAD PyVarObject ob_base;\n\n对象的类型是由该对象指向的 类型对象 决定的,那么类型对象的类型是由谁决定的呢?\n对于其他对象,可以通过与其关联的类型对象确定其类型,那么通过什么来确定一个对象是类型对象呢?\n答案就是 PyType_Type\n源文件:Objects/typeobject.c\n// Objects/typeobject.c\nPyTypeObject PyType_Type = {\n PyVarObject_HEAD_INIT(&PyType_Type, 0)\n \"type\", /* tp_name */\n sizeof(PyHeapTypeObject), /* tp_basicsize */\n sizeof(PyMemberDef), /* tp_itemsize */\n\n ......\n};\n\nPyType_Type 在类型机制中至关重要,所有用户自定义 class 所\n对应的 PyTypeObject 对象都是通过 PyType_Type创建的\n接下来我们看 PyLong_Type 是怎么与 PyType_Type 建立联系的。\n前面提到,在 Python 中,每一个对象都将自己的引用计数、类型信息保存在开始的部分中。\n为了方便对这部分内存初始化,Python 中提供了几个有用的宏:\n源文件:Include/object.h\n// Include/object.h\n#ifdef Py_TRACE_REFS\n #define _PyObject_EXTRA_INIT 0, 0,\n#else\n #define _PyObject_EXTRA_INIT\n#endif\n\n#define PyObject_HEAD_INIT(type) \\\n { _PyObject_EXTRA_INIT \\\n 1, type },\n\n这些宏在各种内建类型对象的初始化中被大量使用。\n以PyLong_Type为例,可以清晰的看到一般的类型对象和PyType_Type之间的关系\n源文件:Objects/longobject.c\n// Objects/longobject.c\n\nPyTypeObject PyLong_Type = {\n PyVarObject_HEAD_INIT(&PyType_Type, 0)\n \"int\", /* tp_name */\n offsetof(PyLongObject, ob_digit), /* tp_basicsize */\n sizeof(digit), /* tp_itemsize */\n\n ......\n};\n\n下图是对象运行时的图像表现\n\n对象的创建\nPython 创建对象有两种方式\n范型 API 或称为 AOL (Abstract Object Layer)\n这类 API 通常形如PyObject_XXX这样的形式。可以应用在任何 Python 对象上,\n如PyObject_New。创建一个整数对象的方式\nPyObject* longobj = PyObject_New(Pyobject, &PyLong_Type);\n\n与类型相关的 API 或称为 COL (Concrete Object Layer)\n这类 API 通常只能作用于某一种类型的对象上,对于每一种内建对象\nPython 都提供了这样一组 API。例如整数对象,我们可以利用如下的 API 创建\nPyObject *longObj = PyLong_FromLong(10);\n\n对象的行为\n在 PyTypeObject 中定义了大量的函数指针。这些函数指针可以视为类型对象中\n所定义的操作,这些操作直接决定着一个对象在运行时所表现出的行为,比如 PyTypeObject 中的 tp_hash 指明了该类型对象如何生成其hash值。\n在PyTypeObject的代码中,我们还可以看到非常重要的三组操作族\n\nPyNumberMethods *tp_as_number\nPySequenceMethods *tp_as_sequence\nPyMappingMethods *tp_as_mapping\n\nPyNumberMethods 的代码如下\n源文件:Include/object.h\n// Include/object.h\ntypedef PyObject * (*binaryfunc)(PyObject *, PyObject *);\n\ntypedef struct {\n binaryfunc nb_matrix_multiply;\n binaryfunc nb_inplace_matrix_multiply;\n\n ......\n} PyNumberMethods;\n\nPyNumberMethods 定义了一个数值对象该支持的操作。一个数值对象如 整数对象,那么它的类型对象 PyLong_Type中tp_as_number.nb_add\n就指定了它进行加法操作时的具体行为。\n在以下代码中可以看出PyLong_Type中的tp_as_number项指向的是long_as_number\n源文件:Objects/longobject.h\n// Objects/longobject.c\nstatic PyNumberMethods long_as_number = {\n (binaryfunc)long_add, /*nb_add*/\n (binaryfunc)long_sub, /*nb_subtract*/\n (binaryfunc)long_mul, /*nb_multiply*/\n\n ......\n};\n\nPyTypeObject PyLong_Type = {\n PyVarObject_HEAD_INIT(&PyType_Type, 0)\n \"int\", /* tp_name */\n offsetof(PyLongObject, ob_digit), /* tp_basicsize */\n sizeof(digit), /* tp_itemsize */\n long_dealloc, /* tp_dealloc */\n 0, /* tp_print */\n 0, /* tp_getattr */\n 0, /* tp_setattr */\n 0, /* tp_reserved */\n long_to_decimal_string, /* tp_repr */\n &long_as_number, /* tp_as_number */\n 0, /* tp_as_sequence */\n 0, /* tp_as_mapping */\n\n ......\n};\n\nPySequenceMethods *tp_as_sequence 和 PyMappingMethods *tp_as_mapping的分析与PyNumberMethods *tp_as_number 相同,大家可以自行查阅源码\n对象的多态性\nPython 创建一个对象比如 PyLongObject 时,会分配内存进行初始化,然后\nPython 内部会用 PyObject* 变量来维护这个对象,其他对象也与此类似\n所以在 Python 内部各个函数之间传递的都是一种范型指针 PyObject*\n我们不知道这个指针所指的对象是什么类型,只能通过所指对象的 ob_type 域\n动态进行判断,而 Python 正是通过 ob_type 实现了多态机制\n考虑以下的 calc_hash 函数\nPy_hash_t\ncalc_hash(PyObject* object)\n{\n Py_hash_t hash = object->ob_type->tp_hash(object);\n return hash;\n}\n\n如果传递给 calc_hash 函数的指针是一个 PyLongObject*,那么它会调用 PyLongObject 对象对应的类型对象中定义的 hash 操作tp_hash,tp_hash可以在PyTypeObject中找到,\n而具体赋值绑定我们可以在 PyLong_Type 初始化代码中看到绑定的是long_hash函数\n源文件:Objects/longobject.c\n// Objects/longobject.c\nPyTypeObject PyLong_Type = {\n PyVarObject_HEAD_INIT(&PyType_Type, 0)\n \"int\", /* tp_name */\n ...\n\n (hashfunc)long_hash, /* tp_hash */\n\n ...\n};\n\n如果指针是一个 PyUnicodeObject*,那么就会调用 PyUnicodeObject 对象对应的类型对象中定义的 hash 操作,查看源码可以看到 实际绑定的是 unicode_hash函数\n源文件:Objects/unicodeobject.c\n// Objects/unicodeobject.c\nPyTypeObject PyUnicode_Type = {\n PyVarObject_HEAD_INIT(&PyType_Type, 0)\n \"str\", /* tp_name */\n\n ...\n\n (hashfunc) unicode_hash, /* tp_hash*/\n\n ...\n};\n\n引用计数\nPython 通过引用计数来管理维护对象在内存中的存在与否\nPython 中的每个东西都是一个对象, 都有ob_refcnt 变量,这个变量维护对象的引用计数,从而最终决定该对象的创建与销毁\n在 Python 中,主要通过 Py_INCREF(op)与Py_DECREF(op) 这两个宏\n来增加和减少对一个对象的引用计数。当一个对象的引用计数减少到 0 之后,\nPy_DECREF将调用该对象的tp_dealloc来释放对象所占用的内存和系统资源;\n但这并不意味着最终一定会调用 free 释放内存空间。因为频繁的申请、释放内存会大大降低 Python 的执行效率。因此 Python 中大量采用了内存对象池的技术,使得对象释放的空间归还给内存池而不是直接free,后续使用可先从对象池中获取\n源文件:Include/object.h\n// Include/object.h\n#define _Py_NewReference(op) ( \\\n _Py_INC_TPALLOCS(op) _Py_COUNT_ALLOCS_COMMA \\\n _Py_INC_REFTOTAL _Py_REF_DEBUG_COMMA \\\n Py_REFCNT(op) = 1)\n\n#define Py_INCREF(op) ( \\\n _Py_INC_REFTOTAL _Py_REF_DEBUG_COMMA \\\n ((PyObject *)(op))->ob_refcnt++)\n\n#define Py_DECREF(op) \\\n do { \\\n PyObject *_py_decref_tmp = (PyObject *)(op); \\\n if (_Py_DEC_REFTOTAL _Py_REF_DEBUG_COMMA \\\n --(_py_decref_tmp)->ob_refcnt != 0) \\\n _Py_CHECK_REFCNT(_py_decref_tmp) \\\n else \\\n _Py_Dealloc(_py_decref_tmp); \\\n } while (0)\n\nCopyright © FlagGo 2019 all right reserved,powered by Gitbook该文件修订时间:\n2020-03-23 19:36:27\n"},"objects/long-object/":{"url":"objects/long-object/","title":"Python 整数对象","keywords":"","body":"Python 整数对象\nCPython2 的整数对象 有 PyIntObject 和 PyLongObject 这两种类型,\nCPython3 只保留了 PyLongObject\n在 源文件:Objects/longobject.c\n的第三行有这么一句话 XXX The functional organization of this file is terrible\n可见这个变化不是一蹴而就的,有比较艰辛的过程,大家有兴趣可以去挖掘一下\nPyLongObject\n源文件:Include/longobject.h\n// longobject.h\n\ntypedef struct _longobject PyLongObject; /* Revealed in longintrepr.h */\n\n源文件:Include/longintrepr.h\n// longintrepr.h\n/* Long integer representation.\n The absolute value of a number is equal to\n 一个数的绝对值等价于下面的表达式\n SUM(for i=0 through abs(ob_size)-1) ob_digit[i] * 2**(SHIFT*i)\n\n Negative numbers are represented with ob_size \n从源码可以看出 PyLongObject 是变长对象\n类型对象 PyLong_Type\n源文件:Objects/longobject.c\n// Objects/longobject.c\n\nPyTypeObject PyLong_Type = {\n PyVarObject_HEAD_INIT(&PyType_Type, 0)\n \"int\", /* tp_name */\n offsetof(PyLongObject, ob_digit), /* tp_basicsize */\n sizeof(digit), /* tp_itemsize */\n long_dealloc, /* tp_dealloc */\n 0, /* tp_print */\n 0, /* tp_getattr */\n 0, /* tp_setattr */\n 0, /* tp_reserved */\n long_to_decimal_string, /* tp_repr */\n &long_as_number, /* tp_as_number */\n 0, /* tp_as_sequence */\n 0, /* tp_as_mapping */\n (hashfunc)long_hash, /* tp_hash */\n 0, /* tp_call */\n long_to_decimal_string, /* tp_str */\n PyObject_GenericGetAttr, /* tp_getattro */\n 0, /* tp_setattro */\n 0, /* tp_as_buffer */\n Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |\n Py_TPFLAGS_LONG_SUBCLASS, /* tp_flags */\n long_doc, /* tp_doc */\n 0, /* tp_traverse */\n 0, /* tp_clear */\n long_richcompare, /* tp_richcompare */\n 0, /* tp_weaklistoffset */\n 0, /* tp_iter */\n 0, /* tp_iternext */\n long_methods, /* tp_methods */\n 0, /* tp_members */\n long_getset, /* tp_getset */\n 0, /* tp_base */\n 0, /* tp_dict */\n 0, /* tp_descr_get */\n 0, /* tp_descr_set */\n 0, /* tp_dictoffset */\n 0, /* tp_init */\n 0, /* tp_alloc */\n long_new, /* tp_new */\n PyObject_Del, /* tp_free */\n};\n\n创建整数对象\n从 PyLong_Type 可以看出,创建一个整数对象的入口函数为 long_new\n源文件:Objects/clinic/longobject.c.h\n// Objects/clinic/longobject.c.h\n/*[clinic input]\npreserve\n[clinic start generated code]*/\n\nstatic PyObject *\nlong_new_impl(PyTypeObject *type, PyObject *x, PyObject *obase);\n\nstatic PyObject *\nlong_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)\n{\n PyObject *return_value = NULL;\n static const char * const _keywords[] = {\"\", \"base\", NULL};\n static _PyArg_Parser _parser = {\"|OO:int\", _keywords, 0};\n PyObject *x = NULL;\n PyObject *obase = NULL;\n\n if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser,\n &x, &obase)) {\n goto exit;\n }\n return_value = long_new_impl(type, x, obase);\n\nexit:\n return return_value;\n}\n\n具体实现在 long_new_impl 源文件:Objects/longobject.c\n// Objects/longobject.c\n\n/*[clinic input]\n@classmethod\nint.__new__ as long_new\n x: object(c_default=\"NULL\") = 0\n /\n base as obase: object(c_default=\"NULL\") = 10\n[clinic start generated code]*/\n\nstatic PyObject *\nlong_new_impl(PyTypeObject *type, PyObject *x, PyObject *obase)\n/*[clinic end generated code: output=e47cfe777ab0f24c input=81c98f418af9eb6f]*/\n{\n Py_ssize_t base;\n\n if (type != &PyLong_Type)\n return long_subtype_new(type, x, obase); /* Wimp out */\n if (x == NULL) {\n if (obase != NULL) {\n PyErr_SetString(PyExc_TypeError,\n \"int() missing string argument\");\n return NULL;\n }\n return PyLong_FromLong(0L);\n }\n if (obase == NULL)\n return PyNumber_Long(x);\n\n base = PyNumber_AsSsize_t(obase, NULL);\n if (base == -1 && PyErr_Occurred())\n return NULL;\n if ((base != 0 && base 36) {\n PyErr_SetString(PyExc_ValueError,\n \"int() base must be >= 2 and \n从 long_new_impl 函数可以看出有如下几种情况\n\nx == NULL 且 obase != NULL 调用 PyLong_FromLong\nobase 为 NULL 调用 PyNumber_Long\nx 和 obase 都不为 NULL\nPyUnicode 调用 PyLong_FromUnicodeObject,最终调用 PyLong_FromString\nPyByteArray/PyBytes 调用_PyLong_FromBytes,最终调用 PyLong_FromString\n\n\n\n小整数对象\n一些整数在一开始就会被初始化一直留存,当再次使用直接从小整数对象池中获取,不用频繁的申请内存。\n默认的小整数范围是 [-5, 257) 源文件:Objects/longobject.c\n// Objects/longobject.c\n\n#ifndef NSMALLPOSINTS\n#define NSMALLPOSINTS 257\n#endif\n#ifndef NSMALLNEGINTS\n#define NSMALLNEGINTS 5\n#endif\n\n#if NSMALLNEGINTS + NSMALLPOSINTS > 0\n/* Small integers are preallocated in this array so that they\n can be shared.\n The integers that are preallocated are those in the range\n -NSMALLNEGINTS (inclusive) to NSMALLPOSINTS (not inclusive). */\nstatic PyLongObject small_ints[NSMALLNEGINTS + NSMALLPOSINTS];\n#ifdef COUNT_ALLOCS\nPy_ssize_t quick_int_allocs, quick_neg_int_allocs;\n#endif\n\nstatic PyObject *\nget_small_int(sdigit ival)\n{\n PyObject *v;\n assert(-NSMALLNEGINTS = 0)\n quick_int_allocs++;\n else\n quick_neg_int_allocs++;\n#endif\n return v;\n}\n#define CHECK_SMALL_INT(ival) \\\n do if (-NSMALLNEGINTS \n宏 CHECK_SMALL_INT 会检查传入的数是否在小整数范围内,如果是直接返回。\n可以在创建或复制整数对象等函数中找到 CHECK_SMALL_INT 的身影,以下只列出了\nPyLong_FromLong,就不一一列举了\n源文件:Objects/longobject.c\n// Object/longobject.c\n\nPyObject *\nPyLong_FromLong(long ival)\n{\n PyLongObject *v;\n unsigned long abs_ival;\n unsigned long t; /* unsigned so >> doesn't propagate sign bit */\n int ndigits = 0;\n int sign;\n\n CHECK_SMALL_INT(ival);\n\n ...\n}\n\n小整数初始化\n源文件:Objects/longobject.c\n// Objects/longobject.c\n\nint\n_PyLong_Init(void)\n{\n#if NSMALLNEGINTS + NSMALLPOSINTS > 0\n int ival, size;\n PyLongObject *v = small_ints;\n\n for (ival = -NSMALLNEGINTS; ival ob_digit[0] == (digit)abs(ival));\n }\n else {\n (void)PyObject_INIT(v, &PyLong_Type);\n }\n Py_SIZE(v) = size;\n v->ob_digit[0] = (digit)abs(ival);\n }\n#endif\n _PyLong_Zero = PyLong_FromLong(0);\n if (_PyLong_Zero == NULL)\n return 0;\n _PyLong_One = PyLong_FromLong(1);\n if (_PyLong_One == NULL)\n return 0;\n\n /* initialize int_info */\n if (Int_InfoType.tp_name == NULL) {\n if (PyStructSequence_InitType2(&Int_InfoType, &int_info_desc) \n整数的存储结构\n源文件:Objects/longobject.c\n在 long_to_decimal_string_internal中添加如下代码并重新编译安装\n// Objects/longobject.c\nstatic int\nlong_to_decimal_string_internal(PyObject *aa,\n PyObject **p_output,\n _PyUnicodeWriter *writer,\n _PyBytesWriter *bytes_writer,\n char **bytes_str)\n{\n PyLongObject *scratch, *a;\n PyObject *str = NULL;\n Py_ssize_t size, strlen, size_a, i, j;\n digit *pout, *pin, rem, tenpow;\n int negative;\n int d;\n enum PyUnicode_Kind kind;\n\n a = (PyLongObject *)aa;\n\n // 添加打印代码\n printf(\"ob_size = %d\\n\", Py_SIZE(a));\n for (int index = 0; index ob_digit[index]);\n }\n\n ...\n}\n\n编译安装后进入 python 解释器输入如下代码\nnum = 9223372043297226753\nprint(num)\n\n# output\n>>> ob_size = 3\n>>> ob_digit[0] = 1\n>>> ob_digit[1] = 6\n>>> ob_digit[2] = 8\n>>> 9223372043297226753\n\n如下图所示\n\n注:这里的 30 是由 PyLong_SHIFT 决定的,64 位系统中,PyLong_SHIFT 为 30,否则 PyLong_SHIFT 为 15\n整数对象的数值操作\n可以看到整数对象的数值操作较多,由于篇幅限制无法一一分析,这里只分析整数的部分操作\n源文件:Objects/longobject.c\n// Objects/longobject.c\n\nstatic PyNumberMethods long_as_number = {\n (binaryfunc)long_add, /*nb_add 加法 */\n (binaryfunc)long_sub, /*nb_subtract 减法 */\n (binaryfunc)long_mul, /*nb_multiply 乘法 */\n long_mod, /*nb_remainder 取余 */\n long_divmod, /*nb_divmod */\n long_pow, /*nb_power 求幂 */\n (unaryfunc)long_neg, /*nb_negative */\n (unaryfunc)long_long, /*tp_positive */\n (unaryfunc)long_abs, /*tp_absolute 绝对值 */\n (inquiry)long_bool, /*tp_bool 求bool值 */\n (unaryfunc)long_invert, /*nb_invert 反转 */\n long_lshift, /*nb_lshift 逻辑左移 */\n (binaryfunc)long_rshift, /*nb_rshift 逻辑右移 */\n long_and, /*nb_and 与操作 */\n long_xor, /*nb_xor 异或 */\n long_or, /*nb_or 或操作 */\n long_long, /*nb_int*/\n 0, /*nb_reserved*/\n long_float, /*nb_float*/\n 0, /* nb_inplace_add */\n 0, /* nb_inplace_subtract */\n 0, /* nb_inplace_multiply */\n 0, /* nb_inplace_remainder */\n 0, /* nb_inplace_power */\n 0, /* nb_inplace_lshift */\n 0, /* nb_inplace_rshift */\n 0, /* nb_inplace_and */\n 0, /* nb_inplace_xor */\n 0, /* nb_inplace_or */\n long_div, /* nb_floor_divide */\n long_true_divide, /* nb_true_divide */\n 0, /* nb_inplace_floor_divide */\n 0, /* nb_inplace_true_divide */\n long_long, /* nb_index */\n};\n\n整数相加\n源文件:Objects/longobject.c\n// Objects/longobject.c\n\nstatic PyObject *\nlong_add(PyLongObject *a, PyLongObject *b)\n{\n PyLongObject *z;\n\n CHECK_BINOP(a, b);\n\n if (Py_ABS(Py_SIZE(a)) \n可以看到整数的加法运算函数 long_add 根据 a、b 的 ob_size 又细分为两个函数 (x_add 和 x_sub) 做处理\n源文件:Objects/longobject.c\n// Objects/longobject.c\n\n/* Add the absolute values of two integers. */\nstatic PyLongObject *\nx_add(PyLongObject *a, PyLongObject *b)\n{\n Py_ssize_t size_a = Py_ABS(Py_SIZE(a)), size_b = Py_ABS(Py_SIZE(b));\n PyLongObject *z;\n Py_ssize_t i;\n digit carry = 0;\n\n /* Ensure a is the larger of the two: */\n // 确保 a 大于 b\n if (size_a ob_digit[i] + b->ob_digit[i];\n z->ob_digit[i] = carry & PyLong_MASK;\n carry >>= PyLong_SHIFT;\n }\n for (; i ob_digit[i];\n z->ob_digit[i] = carry & PyLong_MASK;\n carry >>= PyLong_SHIFT;\n }\n z->ob_digit[i] = carry;\n return long_normalize(z);\n}\n\n加法运算函数 x_add 从 ob_digit 数组的低位开始依次按位相加,carry 做进位处理,然后处理 a 对象的高位数字,最后使用 long_normalize 函数调整 ob_size,确保 ob_digit[abs(ob_size)-1]不为零,这与普通四则运算的加法运算相同,只不过进位单元不同而已\n\n源文件:Objects/longobject.c\n// Objects/longobject.c\n\n/* Subtract the absolute values of two integers. */\n\nstatic PyLongObject *\nx_sub(PyLongObject *a, PyLongObject *b)\n{\n Py_ssize_t size_a = Py_ABS(Py_SIZE(a)), size_b = Py_ABS(Py_SIZE(b));\n PyLongObject *z;\n Py_ssize_t i;\n int sign = 1;\n digit borrow = 0;\n\n /* Ensure a is the larger of the two: */\n // 确保 a 大于 b\n if (size_a = 0 && a->ob_digit[i] == b->ob_digit[i])\n ;\n if (i ob_digit[i] ob_digit[i]) {\n sign = -1;\n { PyLongObject *temp = a; a = b; b = temp; }\n }\n size_a = size_b = i+1;\n }\n z = _PyLong_New(size_a);\n if (z == NULL)\n return NULL;\n for (i = 0; i PyLong_SHIFT. */\n borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;\n z->ob_digit[i] = borrow & PyLong_MASK;\n borrow >>= PyLong_SHIFT;\n borrow &= 1; /* Keep only one sign bit */\n }\n for (; i ob_digit[i] - borrow;\n z->ob_digit[i] = borrow & PyLong_MASK;\n borrow >>= PyLong_SHIFT;\n borrow &= 1; /* Keep only one sign bit */\n }\n assert(borrow == 0);\n if (sign \n与普通四则运算减法相同,数不够大则向高一位借位,\n减法运算函数 x_sub 的示例图如下,注:PyLong_SHIFT 为 30\n\n整数相乘\n源文件:Objects/longobject.c\n// Objects/longobject.c\nstatic PyObject *\nlong_mul(PyLongObject *a, PyLongObject *b)\n{\n PyLongObject *z;\n\n CHECK_BINOP(a, b);\n\n /* fast path for single-digit multiplication */\n if (Py_ABS(Py_SIZE(a)) \nk_mul 函数是一种快速乘法 源文件\n\nKaratsuba 的算法主要是用于两个大数的乘法,极大提高了运算效率,相较于普通乘法降低了复杂度,并在其中运用了递归的思想。\n基本的原理和做法是将位数很多的两个大数 x 和 y 分成位数较少的数,每个数都是原来 x 和 y 位数的一半。\n这样处理之后,简化为做三次乘法,并附带少量的加法操作和移位操作。\n\n具体可以看 wiki Karatsuba 算法的实现\nCopyright © FlagGo 2019 all right reserved,powered by Gitbook该文件修订时间:\n2020-03-23 19:36:27\n"},"objects/list-object/":{"url":"objects/list-object/","title":"Python List 对象","keywords":"","body":"Python List 对象\n在Python中的list可以存放任何类型的数据,查看PyListObject可以发现,list实际存放的是PyObject* 指针\nPyListObject\n源文件:Include/listobject.h\n// listobject.h\n\ntypedef struct {\n PyObject_VAR_HEAD\n /* Vector of pointers to list elements. list[0] is ob_item[0], etc. */\n PyObject **ob_item;\n\n /* ob_item contains space for 'allocated' elements. The number\n * currently in use is ob_size.\n * Invariants:\n * 0 \n示例\nlst = []\nlst.append(1)\n\n其存储结构如下图\n\nPyListObject对象的一些操作\n\n创建PyListObject PyList_New\n对象赋值 PyList_SetItem\n获取元素 PyList_GetItem\n插入元素 PyList_Insert\n追加元素 PyList_Append\n移除元素 list_remove\n调整list大小 list_resize\n\nPyList_New 创建对象\n为了避免频繁的申请内存空间,创建PyListObject的时候会先检查缓冲池是否有可用空间\n源文件:Objects/listobject.c\n// listobject.c\n\nPyObject *\nPyList_New(Py_ssize_t size)\n{\n PyListObject *op;\n#ifdef SHOW_ALLOC_COUNT\n static int initialized = 0;\n if (!initialized) {\n Py_AtExit(show_alloc);\n initialized = 1;\n }\n#endif\n\n // size 合法性检查\n if (size ob_item = NULL;\n else {\n op->ob_item = (PyObject **) PyMem_Calloc(size, sizeof(PyObject *));\n if (op->ob_item == NULL) {\n Py_DECREF(op);\n return PyErr_NoMemory();\n }\n }\n Py_SIZE(op) = size;\n op->allocated = size;\n _PyObject_GC_TRACK(op);\n return (PyObject *) op;\n}\n\nPyListObject缓冲池默认大小为80 源文件:Include/listobject.c\n// listobject.c\n\n/* Empty list reuse scheme to save calls to malloc and free */\n#ifndef PyList_MAXFREELIST\n#define PyList_MAXFREELIST 80\n#endif\nstatic PyListObject *free_list[PyList_MAXFREELIST];\nstatic int numfree = 0;\n\nPyList_SetItem 元素赋值\n源文件:Objects/listobject.c\n// listobject.c\n\nint\nPyList_SetItem(PyObject *op, Py_ssize_t i,\n PyObject *newitem)\n{\n PyObject **p;\n if (!PyList_Check(op)) {\n Py_XDECREF(newitem);\n PyErr_BadInternalCall();\n return -1;\n }\n if (i = Py_SIZE(op)) {\n Py_XDECREF(newitem);\n PyErr_SetString(PyExc_IndexError,\n \"list assignment index out of range\");\n return -1;\n }\n p = ((PyListObject *)op) -> ob_item + i;\n Py_XSETREF(*p, newitem);\n return 0;\n}\n\n元素赋值的示例\nlst = [0, 1, 2]\nlst[0] = 3\n# 这里 lst[0] = 3 会调用 PyList_SetItem 函数\n\nPyList_GetItem 获取元素\n源文件:Objects/listobject.c\n// Objects/listobject.c\n\nPyObject *\nPyList_GetItem(PyObject *op, Py_ssize_t i)\n{\n if (!PyList_Check(op)) {\n PyErr_BadInternalCall();\n return NULL;\n }\n if (i = Py_SIZE(op)) {\n if (indexerr == NULL) {\n indexerr = PyUnicode_FromString(\n \"list index out of range\");\n if (indexerr == NULL)\n return NULL;\n }\n PyErr_SetObject(PyExc_IndexError, indexerr);\n return NULL;\n }\n return ((PyListObject *)op) -> ob_item[i];\n}\n\n获取元素的示例\nlst = [1, 2, 3, 4]\nprint(lst[3])\n# lst[3] 实际调用的就是 PyList_GetItem\n# 根据索引返回对应的元素\n\nPyList_Append 追加元素\nPyList_Append 调用 app1\nint\nPyList_Append(PyObject *op, PyObject *newitem)\n{\n if (PyList_Check(op) && (newitem != NULL))\n return app1((PyListObject *)op, newitem);\n PyErr_BadInternalCall();\n return -1;\n}\n\n源文件:Objects/listobject.c\n// Objects/listobject.c\n\nstatic int\napp1(PyListObject *self, PyObject *v)\n{\n Py_ssize_t n = PyList_GET_SIZE(self);\n\n assert (v != NULL);\n if (n == PY_SSIZE_T_MAX) {\n PyErr_SetString(PyExc_OverflowError,\n \"cannot add more objects to list\");\n return -1;\n }\n\n if (list_resize(self, n+1) \n从app1代码可以看出追加元素操作大致流程如下\n\n调用list_resize,将list大小加一\n将元素插入list尾部\n\nPyList_Insert 插入元素\nPyList_Insert 调用 ins1\nint\nPyList_Insert(PyObject *op, Py_ssize_t where, PyObject *newitem)\n{\n if (!PyList_Check(op)) {\n PyErr_BadInternalCall();\n return -1;\n }\n return ins1((PyListObject *)op, where, newitem);\n}\n\n源文件:Objects/listobject.c\n// Objects/listobject.c\n\nstatic int\nins1(PyListObject *self, Py_ssize_t where, PyObject *v)\n{\n Py_ssize_t i, n = Py_SIZE(self);\n PyObject **items;\n if (v == NULL) {\n PyErr_BadInternalCall();\n return -1;\n }\n if (n == PY_SSIZE_T_MAX) {\n PyErr_SetString(PyExc_OverflowError,\n \"cannot add more objects to list\");\n return -1;\n }\n\n if (list_resize(self, n+1) n)\n where = n;\n items = self->ob_item;\n for (i = n; --i >= where; )\n items[i+1] = items[i];\n Py_INCREF(v);\n items[where] = v;\n return 0;\n}\n\n从ins1代码可以看出插入元素操作大致流程如下\n\n调用list_resize,将list大小加一\n将要插入的位置的元素都往后移一个位置\n将元素插入指定位置\n\nlist_remove 移除元素\n源文件:Objects/listobject.c\n// listobject.c\n\nstatic PyObject *\nlist_remove(PyListObject *self, PyObject *value)\n/*[clinic end generated code: output=f087e1951a5e30d1 input=2dc2ba5bb2fb1f82]*/\n{\n Py_ssize_t i;\n\n for (i = 0; i ob_item[i], value, Py_EQ);\n if (cmp > 0) {\n if (list_ass_slice(self, i, i+1,\n (PyObject *)NULL) == 0)\n Py_RETURN_NONE;\n return NULL;\n }\n else if (cmp \n移除元素示例\nlst = [0, 2, 4, 3]\nlst.remove(3)\n\"\"\"\nlst.remove(3) 会调用 list_remove函数,\nlist_remove函数会遍历列表,使用PyObject_RichCompareBool与目标值进行比较,\n相同则调用list_ass_slice进行移除,当遍历完列表还未找到则报错\n\"\"\"\n\nlist_resize 调整list存储空间\n随着list元素的增加,list的存储空间可能会不够用,这个时候就需要扩大list的存储空间。\n随着list元素的减少,list的存储空间可能存在冗余,这个时候就需要缩小list的存储空间。\n函数list_resize就是用于调节list存储空间大小的\n源文件:Objects/listobject.c\n// listobject.c\n\nstatic int\nlist_resize(PyListObject *self, Py_ssize_t newsize)\n{\n PyObject **items;\n size_t new_allocated, num_allocated_bytes;\n Py_ssize_t allocated = self->allocated;\n\n /* Bypass realloc() when a previous overallocation is large enough\n to accommodate the newsize. If the newsize falls lower than half\n the allocated size, then proceed with the realloc() to shrink the list.\n */\n if (allocated >= newsize && newsize >= (allocated >> 1)) {\n assert(self->ob_item != NULL || newsize == 0);\n Py_SIZE(self) = newsize;\n return 0;\n }\n\n /* This over-allocates proportional to the list size, making room\n * for additional growth. The over-allocation is mild, but is\n * enough to give linear-time amortized behavior over a long\n * sequence of appends() in the presence of a poorly-performing\n * system realloc().\n * The growth pattern is: 0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ...\n * Note: new_allocated won't overflow because the largest possible value\n * is PY_SSIZE_T_MAX * (9 / 8) + 6 which always fits in a size_t.\n */\n new_allocated = (size_t)newsize + (newsize >> 3) + (newsize (size_t)PY_SSIZE_T_MAX / sizeof(PyObject *)) {\n PyErr_NoMemory();\n return -1;\n }\n\n if (newsize == 0)\n new_allocated = 0;\n num_allocated_bytes = new_allocated * sizeof(PyObject *);\n items = (PyObject **)PyMem_Realloc(self->ob_item, num_allocated_bytes);\n if (items == NULL) {\n PyErr_NoMemory();\n return -1;\n }\n self->ob_item = items;\n Py_SIZE(self) = newsize;\n self->allocated = new_allocated;\n return 0;\n}\n\n当 allocated/2 时,list_resize只会改变 ob_size不会改变allocated。\n其他情况则需要调用PyMem_Realloc函数分配新的空间存储列表元素。\n列表allocated的增长模式是 0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ...\n其公式为 new_allocated = (size_t)newsize + (newsize >> 3) + (newsize \nCopyright © FlagGo 2019 all right reserved,powered by Gitbook该文件修订时间:\n2020-03-23 19:36:27\n"},"objects/dict-object/":{"url":"objects/dict-object/","title":"Python Dict 对象","keywords":"","body":"Python 字典\nDictionary object implementation using a hash table ,通过描述可知,python 的字典就是实现了一个 hash 表。\nPython 字典概述\n在 python 的字典中,一个键值对的对应保存就是 PyDictEntry 类型来保存;\n源文件:Include/dict-common.h\n// Objects/dict-common.h\ntypedef struct {\n /* Cached hash code of me_key. */\n Py_hash_t me_hash;\n PyObject *me_key;\n PyObject *me_value; /* This field is only meaningful for combined tables */\n} PyDictKeyEntry;\n\n其中,me_hash 就是哈希生成的值,me_key 就是对应的 key 值,me_value 就是对应的值。\n在 python 中,在一个 PyDictObject 对象的变化过程中,entry 的状态会在不同的状态间转换。基本上在如下四种状态中转换:Unused、Active、Dummy 和 Pending。\n\nUnused:没有插入任何一个获取的 key 与 value,并且在此之前也没有存储任何的 key,value,每一个 entry 在初始化的时候都会处于这种状态,并且 Unused 会被里面切换到 Active 态,当有 key 插入,这就是 entry 初始化的状态。\nActive:当 index>=0 时,me_key 不为空并且 me_value 不为空,保存了一个键值对,Active 可以转变为 Dummy 或者 Pending 状态,当一个键被删除的时候,这只会在 me_value 不为空的时候出现。\nDummy:先前保存了一个 Active 的键值对,但是这个键值对被删除了并且一个活跃的键值对还没有填入该位置,Dummy 可以转变为 Active 当删除的时候,Dummy 的位置不能被重新使用,一旦发生碰撞,探针序列就无法知道这对键值对曾是活跃的键值对。\nPending:索引>=0,键!=空,值=空(仅拆分),尚未插入到拆分表中。\n\n字典的两种类型\npython 的字典类型中包含了两种,分离字典(split-table dictionaries)与联合字典(combined-table dictonaries)。详细的信息可查看有关 dict 的描述pep-0412。\nsplit-table dictionaries\n当被创建的字典是用来保存 object 的__dict__属性时,该字典才会创建为一个 split-table,它们的键表都被缓存在类型属性中,并且允许所有该类型的实例都可以共享该 keys。当出现一个事件将字典的属性值进行改变的时候,个别字典将慢慢的转化成组合表的形式。这就保证了在大部分的应用场景下很高的内存利用效率,并保证了在各个场景下的正确性。当 split-dict 重新改变大小,它会立马改变为一个 combined-table,如果重置大小作为保存实例属性的结果,并且只有一个该 object 的实例,字典会立马再变为一个 split-table。如果从 split-table 中删除一个 key, value,它不会删除 keys tables 中对应的该值,而只是将 values 数值中移除了该 value。\ncombined-table dictionaries\n直接通过 dict 內建函数与{}生成的字典,模块和大部分其他字典都会创建为 combined-table 字典,一个 combined-table 不会改变为一个 split-table 字典,该字典的行为方式与最初的字典的行为方式大致相同。\n容器的相关数据结构\n字典对象是通过 PyDictObject 来实现数据的,详情如下;\n源文件:Include/dictobject.h\n// Include/dictobject.h\ntypedef struct _dictkeysobject PyDictKeysObject;\n\n/* The ma_values pointer is NULL for a combined table\n * or points to an array of PyObject* for a split table\n */\ntypedef struct {\n PyObject_HEAD\n\n /* Number of items in the dictionary */\n Py_ssize_t ma_used;  // 使用的keys个数\n\n /* Dictionary version: globally unique, value change each time\n the dictionary is modified */\n uint64_t ma_version_tag;\n\n PyDictKeysObject *ma_keys;     // 如果有则是保存的keys数据\n\n /* If ma_values is NULL, the table is \"combined\": keys and values\n are stored in ma_keys.\n\n If ma_values is not NULL, the table is splitted:\n keys are stored in ma_keys and values are stored in ma_values */\n PyObject **ma_values;  // 如果不为空则保存的是values\n} PyDictObject;\n\n其中,PyDictKeysObject 的定义如下;\n源文件:Include/dict-common.h\n// Objects/dict-common.h\n/* See dictobject.c for actual layout of DictKeysObject */\nstruct _dictkeysobject {\n Py_ssize_t dk_refcnt;                  // 引用计数\n\n /* Size of the hash table (dk_indices). It must be a power of 2. */\n Py_ssize_t dk_size;                   // hash table 的大小必须是2的倍数\n\n /* Function to lookup in the hash table (dk_indices):\n\n - lookdict(): general-purpose, and may return DKIX_ERROR if (and\n only if) a comparison raises an exception.\n\n - lookdict_unicode(): specialized to Unicode string keys, comparison of\n which can never raise an exception; that function can never return\n DKIX_ERROR.\n\n - lookdict_unicode_nodummy(): similar to lookdict_unicode() but further\n specialized for Unicode string keys that cannot be the value.\n\n - lookdict_split(): Version of lookdict() for split tables. */\n dict_lookup_func dk_lookup; // 哈希查找函数\n\n /* Number of usable entries in dk_entries. */\n Py_ssize_t dk_usable; // 可用的entry数量\n\n /* Number of used entries in dk_entries. */ \n Py_ssize_t dk_nentries;          // 已经使用的entry数量\n\n /* Actual hash table of dk_size entries. It holds indices in dk_entries,\n or DKIX_EMPTY(-1) or DKIX_DUMMY(-2).\n\n Indices must be: 0 \n相关数据结构的内存布局为;\n\nPython 字典示例\n本次示例脚本如下:\nd = {}\nd['1']='2'\nd['1']='e'\nd.pop('1')\n\n通过 Python 的反汇编工具获取字节码;\npython -m dis dict_test.py\n\n输出的字节码如下;\n 2 0 BUILD_MAP 0\n 2 STORE_NAME 0 (d)\n\n 3 4 LOAD_CONST 0 ('2')\n 6 LOAD_NAME 0 (d)\n 8 LOAD_CONST 1 ('1')\n 10 STORE_SUBSCR\n\n 4 12 LOAD_CONST 2 ('e')\n 14 LOAD_NAME 0 (d)\n 16 LOAD_CONST 1 ('1')\n 18 STORE_SUBSCR\n\n 5 20 LOAD_NAME 0 (d)\n 22 LOAD_METHOD 1 (pop)\n 24 LOAD_CONST 1 ('1')\n 26 CALL_METHOD 1\n 28 POP_TOP\n 30 LOAD_CONST 3 (None)\n 32 RETURN_VALUE\n\n通过字节码指令可知,首先调用了 BUILD_MAP 来创建一个新的字典,接着就对新建的字典 d 进行了赋值操作与更新操作,最后调用了 pop 方法删除一个 key。接下来就详细分析一下相关流程。\n字典的初始化流程\n通过查找 BUILD_MAP 的虚拟机执行函数;\n源文件:Python/ceval.c\n// Python/ceval.c\nswitch (opcode) {\n ...\n\n TARGET(BUILD_MAP) {\n Py_ssize_t i;\n PyObject *map = _PyDict_NewPresized((Py_ssize_t)oparg); // 新建并初始化一个字典\n if (map == NULL)\n goto error;  // 如果新建失败则报错\n for (i = oparg; i > 0; i--) {   // 检查在新建的过程中是否通过参数传值\n int err;\n PyObject *key = PEEK(2*i);\n PyObject *value = PEEK(2*i - 1);\n err = PyDict_SetItem(map, key, value);      // 找到对应的值并讲该值设置到map中\n if (err != 0) {                        // 检查是否报错\n Py_DECREF(map);\n goto error;                        // 如果错误就报错处理\n }\n }\n\n while (oparg--) {\n Py_DECREF(POP());                       // 弹出栈上输入参数的引用\n Py_DECREF(POP());\n }\n PUSH(map);                              // 讲生成的map压栈\n DISPATCH();                             // 检查是否需要执行下一条字节码指令\n }\n}\n\n从该函数的执行可知,初始化的函数是从_PyDict_NewPresized 开始,该函数就是生成并初始化一个字典;\n源文件:Objects/dictobject.c\n// Objects/dictobject.c\n\nPyObject *\n_PyDict_NewPresized(Py_ssize_t minused)\n{\n const Py_ssize_t max_presize = 128 * 1024;  // 字典最大的容量\n Py_ssize_t newsize;\n PyDictKeysObject *new_keys;\n\n /* There are no strict guarantee that returned dict can contain minused\n * items without resize. So we create medium size dict instead of very\n * large dict or MemoryError.\n */\n if (minused > USABLE_FRACTION(max_presize)) { // 检查传入的数量是否超过最大值\n newsize = max_presize;\n }\n else {\n Py_ssize_t minsize = ESTIMATE_SIZE(minused); // 获取最小的值,在新建一个空的字典的时候该值为0\n newsize = PyDict_MINSIZE; // 设置字典的最小值 为8\n while (newsize \n首先,先计算出需要生成的字典的大小,然后再初始化一个 PyDictKeysObject,最后就生成一个 PyDictObject 返回。继续查看 new_keys_object 的执行流程;\n源文件:Objects/dictobject.c\n// Objects/dictobject.c\n\nstatic PyDictKeysObject *new_keys_object(Py_ssize_t size)\n{\n PyDictKeysObject *dk;\n Py_ssize_t es, usable;\n\n assert(size >= PyDict_MINSIZE); // 检查size是否大于最小size\n assert(IS_POWER_OF_2(size)); // 检查是否是2的倍数\n\n usable = USABLE_FRACTION(size); // 检查是否可用  根据经验在1/2和2/3之间效果最好\n if (size 4\n else if (size 0) {      // 是否有缓存,如果有缓存就选择缓存中的dk\n dk = keys_free_list[--numfreekeys];\n }\n else {\n dk = PyObject_MALLOC(sizeof(PyDictKeysObject)\n + es * size\n + sizeof(PyDictKeyEntry) * usable); // 没有缓存可使用的字典则申请内存生成一个\n if (dk == NULL) {\n PyErr_NoMemory();\n return NULL;\n }\n }\n DK_DEBUG_INCREF dk->dk_refcnt = 1; // 设置引用计数\n dk->dk_size = size; // 设置大小\n dk->dk_usable = usable; // 设置是否可用\n dk->dk_lookup = lookdict_unicode_nodummy; // 设置查找函数\n dk->dk_nentries = 0;\n memset(&dk->dk_indices[0], 0xff, es * size); // 将申请的内存置空\n memset(DK_ENTRIES(dk), 0, sizeof(PyDictKeyEntry) * usable);\n return dk;\n}\n\n主要就是通过传入的 size,检查是否超过设置的大小,检查是否有缓存的字典数据可用,如果没有则申请内存重新生成一个 dk,最后进行申请到的内存讲内容清空。接着就会进行 new_dict 初始化数据;\n源文件:Objects/dictobject.c\n// Objects/dictobject.c\n\n/* Consumes a reference to the keys object */\nstatic PyObject *\nnew_dict(PyDictKeysObject *keys, PyObject **values)\n{\n PyDictObject *mp;\n assert(keys != NULL);\n if (numfree) {                            // 判断缓冲池是否有\n mp = free_list[--numfree];\n assert (mp != NULL);\n assert (Py_TYPE(mp) == &PyDict_Type); \n _Py_NewReference((PyObject *)mp);              // 使用缓冲池对象    \n }\n else {\n mp = PyObject_GC_New(PyDictObject, &PyDict_Type);    // 缓冲池没有则申请新的对象并初始化\n if (mp == NULL) {\n DK_DECREF(keys);\n free_values(values);\n return NULL;\n }\n }\n mp->ma_keys = keys;\n mp->ma_values = values;\n mp->ma_used = 0;                           // 设置ma_used为0\n mp->ma_version_tag = DICT_NEXT_VERSION();\n assert(_PyDict_CheckConsistency(mp));\n return (PyObject *)mp;\n}\n\nnew_dict 就是根据 keys,values 设置到从缓冲池或者新生成一个 dict 对象,最后返回。至此,dict 的创建工作已经完成。\n字典的插入与查找\n通过字节码的指令 STORE_SUBSCR 可知,该命令就是讲'1'作为 key, '2'作为 value 插入到 d 中,此时查看该执行函数;\n源文件:Python/ceval.c\n// Python/ceval.c\nswitch (opcode) {\n ...\n\n TARGET(STORE_SUBSCR) {\n PyObject *sub = TOP(); // 第一个值为key\n PyObject *container = SECOND(); // 该为字典对象\n PyObject *v = THIRD(); // 该为value\n int err;\n STACKADJ(-3);\n /* container[sub] = v */\n err = PyObject_SetItem(container, sub, v); // 调用该方法设置值\n Py_DECREF(v);\n Py_DECREF(container);\n Py_DECREF(sub);\n if (err != 0)\n goto error;\n DISPATCH();\n }\n}\n\n此时,从栈中取出相关参数,并将这些值传入 PyObject_SetItem 函数进行处理设置值;\n源文件:Objects/abstract.c\n// Objects/abstract.c\nint\nPyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)\n{\n PyMappingMethods *m;\n\n if (o == NULL || key == NULL || value == NULL) {           // 检查是否为空如果任一为空则报错\n null_error();\n return -1;\n }\n m = o->ob_type->tp_as_mapping;                      // 获取类型的tp_as_mapping方法集     \n if (m && m->mp_ass_subscript)                       // 如果有设置该类型\n return m->mp_ass_subscript(o, key, value); // 调用该mp_ass_subscript方法\n\n if (o->ob_type->tp_as_sequence) { // 获取作为队列的操作集\n if (PyIndex_Check(key)) {                       // 检查key是否是索引\n Py_ssize_t key_value;\n key_value = PyNumber_AsSsize_t(key, PyExc_IndexError); \n if (key_value == -1 && PyErr_Occurred())\n return -1;\n return PySequence_SetItem(o, key_value, value);       // 调用索引插入\n }\n else if (o->ob_type->tp_as_sequence->sq_ass_item) {\n type_error(\"sequence index must be \"\n \"integer, not '%.200s'\", key);\n return -1;\n }\n }\n\n type_error(\"'%.200s' object does not support item assignment\", o);   // 则该类型对象不支持设置\n return -1;\n}\n\n其中就调用了字典的 tp_as_mapping 的方法集,并调用了该方法集的 mp_ass_subscript 方法;此时我们分析一下,dict 的 tp_as_mapping 的方法集。此时就调用了 tp_as_mapping 的 mp_ass_subscript 方法,此时就是调用 dict 的 dict_ass_sub 方法;\n源文件:Objects/dictobject.c\n// Objects/dictobject.c\nstatic int\ndict_ass_sub(PyDictObject *mp, PyObject *v, PyObject *w)\n{\n if (w == NULL)\n return PyDict_DelItem((PyObject *)mp, v);\n else\n return PyDict_SetItem((PyObject *)mp, v, w);\n}\n\n可知,删除一个 key 就是 PyDict_DelItem,设置一个 key 就是 PyDict_SetItem;\n源文件:Objects/dictobject.c\n// Objects/dictobject.c\nint\nPyDict_SetItem(PyObject *op, PyObject *key, PyObject *value)\n{\n PyDictObject *mp;\n Py_hash_t hash;\n if (!PyDict_Check(op)) {            // 检查是否是字典类型\n PyErr_BadInternalCall();\n return -1;\n }\n assert(key);\n assert(value);\n mp = (PyDictObject *)op;\n if (!PyUnicode_CheckExact(key) ||\n (hash = ((PyASCIIObject *) key)->hash) == -1)  // 检查传入的key是否hash为-1\n {\n hash = PyObject_Hash(key); // 生成hash调用key对应的tp_hash方法,在本例中传入的是str类型,则调用str类型的tp_hash方法\n if (hash == -1)\n return -1;\n }\n\n /* insertdict() handles any resizing that might be necessary */\n return insertdict(mp, key, hash, value); // 生成hash调用key对应的tp_hash方法\n}\n\ninsertdict 方法就是将生成的方法,插入到字典中去;\n源文件:Objects/dictobject.c\n// Objects/dictobject.c\nstatic int\ninsertdict(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject *value)\n{\n PyObject *old_value;\n PyDictKeyEntry *ep;\n\n Py_INCREF(key);\n Py_INCREF(value);\n if (mp->ma_values != NULL && !PyUnicode_CheckExact(key)) {\n if (insertion_resize(mp) ma_keys->dk_lookup(mp, key, hash, &old_value);     // 调用查找方法\n if (ix == DKIX_ERROR)\n goto Fail;\n\n assert(PyUnicode_CheckExact(key) || mp->ma_keys->dk_lookup == lookdict);\n MAINTAIN_TRACKING(mp, key, value); // 检查mp key values是否需要加入垃圾回收\n\n /* When insertion order is different from shared key, we can't share\n * the key anymore. Convert this instance to combine table.\n */\n if (_PyDict_HasSplitTable(mp) &&\n ((ix >= 0 && old_value == NULL && mp->ma_used != ix) ||\n (ix == DKIX_EMPTY && mp->ma_used != mp->ma_keys->dk_nentries))) {  // 检查是否是分离表,如果没查找到旧值并且\n if (insertion_resize(mp) ma_keys->dk_usable ma_keys, hash);         // 查找一个可用的hash位置\n ep = &DK_ENTRIES(mp->ma_keys)[mp->ma_keys->dk_nentries];         // 获取存取的地址\n dk_set_index(mp->ma_keys, hashpos, mp->ma_keys->dk_nentries);      // 设置该值\n ep->me_key = key;                                 // 保存key\n ep->me_hash = hash; // 保存计算得出的hash值\n if (mp->ma_values) {                               // 如果mp的ma_values有值\n assert (mp->ma_values[mp->ma_keys->dk_nentries] == NULL);\n mp->ma_values[mp->ma_keys->dk_nentries] = value;           // 设置该key对应的value\n }\n else {\n ep->me_value = value; // 直接讲value设置到entry上面\n }\n mp->ma_used++;                                   // 使用个数加1\n mp->ma_version_tag = DICT_NEXT_VERSION();  \n mp->ma_keys->dk_usable--;                            // 可用减1\n mp->ma_keys->dk_nentries++;\n assert(mp->ma_keys->dk_usable >= 0);\n assert(_PyDict_CheckConsistency(mp));\n return 0;\n }\n\n if (_PyDict_HasSplitTable(mp)) { // 如果是分离的\n mp->ma_values[ix] = value; // 直接设置ma_values对应的ix到values中\n if (old_value == NULL) {\n /* pending state */\n assert(ix == mp->ma_used);\n mp->ma_used++;                               // 使用加1\n }\n }\n else {\n assert(old_value != NULL);\n DK_ENTRIES(mp->ma_keys)[ix].me_value = value;\n }\n\n mp->ma_version_tag = DICT_NEXT_VERSION();\n Py_XDECREF(old_value); /* which **CAN** re-enter (see issue #22653) */\n assert(_PyDict_CheckConsistency(mp));\n Py_DECREF(key);\n return 0;\n\nFail:\n Py_DECREF(value);\n Py_DECREF(key);\n return -1;\n}\n\n首先会调用相关的查找方法,去查找待搜索的值是否已经存在字典中,如果当前字典数据已经满了则会按照增长大小的函数生成一个新的字典,并把旧数据设置到新的字典中,当找到的字典匹配时则返回。\n其中 dk_lookup 对应的方法,在初始化之后对应的是 lookdict_unicode_nodummy;\n源文件:Objects/dictobject.c\n// Objects/dictobject.c\n\n/* Faster version of lookdict_unicode when it is known that no keys\n * will be present. */\nstatic Py_ssize_t _Py_HOT_FUNCTION\nlookdict_unicode_nodummy(PyDictObject *mp, PyObject *key,\n Py_hash_t hash, PyObject **value_addr)\n{\n assert(mp->ma_values == NULL);\n /* Make sure this function doesn't have to handle non-unicode keys,\n including subclasses of str; e.g., one reason to subclass\n unicodes is to override __eq__, and for speed we don't cater to\n that here. */\n if (!PyUnicode_CheckExact(key)) {                     // 检查如果不是unicode则直接调用lookdict方法查找\n mp->ma_keys->dk_lookup = lookdict;\n return lookdict(mp, key, hash, value_addr);\n }\n\n PyDictKeyEntry *ep0 = DK_ENTRIES(mp->ma_keys);             // 获取keys的首个元素地址\n size_t mask = DK_MASK(mp->ma_keys);                    // 获取大小\n size_t perturb = (size_t)hash;\n size_t i = (size_t)hash & mask;                       // 获取生成的最终的值                 \n\n for (;;) {\n Py_ssize_t ix = dk_get_index(mp->ma_keys, i); // 便利ma_keys key列表\n assert (ix != DKIX_DUMMY);                     // 判断不能为空\n if (ix == DKIX_EMPTY) { // 如果为空则证明找到一个可以使用的\n *value_addr = NULL;                       // 讲key对应的value设置为空\n return DKIX_EMPTY;                        // 返回\n }\n PyDictKeyEntry *ep = &ep0[ix];             // 获取该位置元素值\n assert(ep->me_key != NULL);\n assert(PyUnicode_CheckExact(ep->me_key));\n if (ep->me_key == key ||\n (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {  // 如果key相同 hash值也相同\n *value_addr = ep->me_value;                    // 将该值赋值\n return ix;\n }\n perturb >>= PERTURB_SHIFT;                      // 偏移\n i = mask & (i*5 + perturb + 1);                   // 获取下一个位置\n }\n Py_UNREACHABLE();\n}\n\n该函数的主要工作就是查找,字典中是否有空余的值,或者如果找到了满足 hash 值与 key 相同的就将 value 设置为找到的值(这也是字典查找的核心逻辑)。至此,字典的插入的大致流程已经分析完毕。\nPython 字典的操作测试\n现在我们动手观看一下具体的操作实例,首先声明,该例子仅供调试使用,目前调试的字典的 key 与 value 都是 float 类型并且不能 del 或者 pop 其中的 key。操作字典如下所示;\nd = {20000:2}\nd[1] = 2\nd[3] = 2\n\n首先,讲如下代码插入到 dictobject.c 的 1060 行;\n// 测试代码\nPyObject* key1 = PyLong_FromLong(20000);\nPy_hash_t hash1 = PyObject_Hash(key1);\nPyObject* old_value1;\nPy_ssize_t ix1 = mp->ma_keys->dk_lookup(mp, key1, hash1, &old_value1);\nif (ix1 == 0){\n PyLongObject* give;\n give = (PyLongObject* )key1;\n printf(\"found value : %ld\\n\", give->ob_digit[0]);\n PyDictKeyEntry *ep01 = DK_ENTRIES(mp->ma_keys);\n int i, count;\n count = mp->ma_used;\n int size_count, j;\n size_count = mp->ma_keys->dk_size;\n printf(\"%s \", mp->ma_keys->dk_indices);\n int8_t *indices = (int8_t*)(mp->ma_keys->dk_indices);\n printf(\"indices index values :\");\n for (j=0; jme_key;\n printf(\"size : %d \", mp->ma_keys->dk_size);\n printf(\"found value while  key : %ld \", give->ob_digit[0]);\n give = (PyLongObject* )ep01->me_value;\n printf(\"value : %ld\\n\", give->ob_digit[0]);\n ep01++;\n }\n}\n\n然后编译运行;\nPython 3.7.3 (default, May 22 2019, 16:17:57)\n[GCC 7.3.0] on linux\nType \"help\", \"copyright\", \"credits\" or \"license\" for more information.\n>>> d = {20000:2}\nfound value : 20000\n indices index values :0 -1 -1 -1 -1 -1 -1 -1\nsize : 8 found value while  key : 20000 value : 2\n\n其中为什么初始化的时候输入 20000,是根据代码找到相关的 key 值,因为字典也被 python 自身实现的结构中引用了多次,所以我们就设置了一个特殊值来跟踪我们想要的字典;当 d 初始化的时候,就输出如上所示内容;我们接下来继续操作;\n>>> d = {20000:2}\nfound value : 20000\n indices index values :0 -1 -1 -1 -1 -1 -1 -1\nsize : 8 found value while  key : 20000 value : 2\n>>> d[2] = 3\nfound value : 20000\n indices index values :0 -1 1 -1 -1 -1 -1 -1\nsize : 8 found value while  key : 20000 value : 2\nsize : 8 found value while  key : 2 value : 3\n>>> d[3] = 4\nfound value : 20000\n indices index values :0 -1 1 2 -1 -1 -1 -1\nsize : 8 found value while  key : 20000 value : 2\nsize : 8 found value while  key : 2 value : 3\nsize : 8 found value while  key : 3 value : 4\n>>> d[5] = 6\nfound value : 20000\n indices index values :0 -1 1 2 -1 3 -1 -1\nsize : 8 found value while  key : 20000 value : 2\nsize : 8 found value while  key : 2 value : 3\nsize : 8 found value while  key : 3 value : 4\nsize : 8 found value while  key : 5 value : 6\n>>> d[7] = 8\nfound value : 20000\n indices index values :0 -1 1 2 -1 3 -1 4\nsize : 8 found value while  key : 20000 value : 2\nsize : 8 found value while  key : 2 value : 3\nsize : 8 found value while  key : 3 value : 4\nsize : 8 found value while  key : 5 value : 6\nsize : 8 found value while  key : 7 value : 8\n\n此后我们一直添加值进 d,从输出信息可知,index 就是记录了 PyDictKeyEntry 的索引值,-1 就表示该处未使用。\n当我们继续向 d 中添加内容时;\n>>> d[9] = 10\nfound value : 20000\n indices index values :0 -1 1 2 -1 3 -1 4 -1 5 -1 -1 -1 -1 -1 -1\nsize : 16 found value while  key : 20000 value : 2\nsize : 16 found value while  key : 2 value : 3\nsize : 16 found value while  key : 3 value : 4\nsize : 16 found value while  key : 5 value : 6\nsize : 16 found value while  key : 7 value : 8\nsize : 16 found value while  key : 9 value : 10\n>>> d[10] = 11\nfound value : 20000\n indices index values :0 -1 1 2 -1 3 -1 4 -1 5 6 -1 -1 -1 -1 -1\nsize : 16 found value while  key : 20000 value : 2\nsize : 16 found value while  key : 2 value : 3\nsize : 16 found value while  key : 3 value : 4\nsize : 16 found value while  key : 5 value : 6\nsize : 16 found value while  key : 7 value : 8\nsize : 16 found value while  key : 9 value : 10\nsize : 16 found value while  key : 10 value : 11\n\n从输出内容可知,字典的大小随之改变了,这也说明了 python 字典的最佳大小容量限定在 1/2 到 2/3 之间,如果超过这个阈值则字典就会自动扩容,扩容的策略大家可详细查看源码。\nCopyright © FlagGo 2019 all right reserved,powered by Gitbook该文件修订时间:\n2020-03-23 19:36:27\n"},"objects/set-object/":{"url":"objects/set-object/","title":"Python Set 对象","keywords":"","body":"python 集合\nset 是无序且不重复的集合,是可变的,通常用来从列表中删除重复项以及计算数学运算,如交集、并集、差分和对称差分等集合操作。set 支持 x in set, len(set),和 for x in set。作为一个无序的集合,set 不记录元素位置或者插入点。因此,sets 不支持 indexing, 或其它类序列的操作。\npython 集合概述\n在 set 中,对应的 set 的值的存储是通过结构 setentry 来保存数据值的;\n源文件:include/setobject.h\ntypedef struct {\n PyObject *key;\n Py_hash_t hash; /* Cached hash code of the key */\n} setentry;\n\nkey 就是保存的数据,hash 就是保存的数据的 hash,便于查找,set 也是基于 hash 表来实现。对应的 setentry 所对应的 set 的数据结构如下;\n源文件:include/setobject.h\ntypedef struct {\n PyObject_HEAD\n\n Py_ssize_t fill; /* Number active and dummy entries*/ // 包括已经使用的entry与空entry值的总和\n Py_ssize_t used; /* Number active entries */ // 已经使用可用的总量\n\n /* The table contains mask + 1 slots, and that's a power of 2.\n * We store the mask instead of the size because the mask is more\n * frequently needed.\n */\n Py_ssize_t mask;                                // 与hash求和的mask\n\n /* The table points to a fixed-size smalltable for small tables\n * or to additional malloc'ed memory for bigger tables.\n * The table pointer is never NULL which saves us from repeated\n * runtime null-tests.\n */\n setentry *table; // 保存数据的数组数组指针\n Py_hash_t hash; /* Only used by frozenset objects */\n Py_ssize_t finger; /* Search finger for pop() */\n\n setentry smalltable[PySet_MINSIZE]; // 保存数据的数组 默认初始化为8个元素,通过table指向\n PyObject *weakreflist; /* List of weak references */\n} PySetObject;\n\n一个 set 就对应一个 PySetObject 类型数据,set 会根据保存的元素自动调整大小。相关的内存布局如下;\n\npython 集合(set)示例\n示例脚本如下:\nset_a = {1,2} \nset_a.add(3)\nset_a.add(4)\nset_a.remove(1)\nset_a.update({3,})\nset_a.union({1,5})\n\n通过 python 反汇编获取该脚本的字节码;\npython -m dis set_test.py\n输出的字节码如下所示;\n 1 0 LOAD_CONST 0 (1)\n 3 LOAD_CONST 1 (2)\n 6 BUILD_SET 2\n 9 STORE_NAME 0 (set_a)\n\n 2 12 LOAD_NAME 0 (set_a)\n 15 LOAD_ATTR 1 (add)\n 18 LOAD_CONST 2 (3)\n 21 CALL_FUNCTION 1\n 24 POP_TOP\n\n 3 25 LOAD_NAME 0 (set_a)\n 28 LOAD_ATTR 1 (add)\n 31 LOAD_CONST 3 (4)\n 34 CALL_FUNCTION 1\n 37 POP_TOP\n\n 4 38 LOAD_NAME 0 (set_a)\n 41 LOAD_ATTR 2 (remove)\n 44 LOAD_CONST 0 (1)\n 47 CALL_FUNCTION 1\n 50 POP_TOP\n\n 5 51 LOAD_NAME 0 (set_a)\n 54 LOAD_ATTR 3 (update)\n 57 LOAD_CONST 2 (3)\n 60 BUILD_SET 1\n 63 CALL_FUNCTION 1\n 66 POP_TOP\n\n 6 67 LOAD_NAME 0 (set_a)\n 70 LOAD_ATTR 4 (union)\n 73 LOAD_CONST 0 (1)\n 76 LOAD_CONST 4 (5)\n 79 BUILD_SET 2\n 82 CALL_FUNCTION 1\n 85 POP_TOP\n 86 LOAD_CONST 5 (None)\n 89 RETURN_VALUE\n\n通过该字节码指令可知,创建 set 调用了 BUILD_SET 指令,初始化完成之后,就调用 set 的 add 方法添加元素,调用 remove 删除元素,调用 update 来更新集合,通过 union 来合并集合。接下来就详细分析一下相关的操作流程。\nset 的创建与初始化\n查找 BUILD_SET 的虚拟机执行函数如下;\n源文件:Python/ceval.c\n// Python/ceval.c\n\n TARGET(BUILD_SET) {\n PyObject *set = PySet_New(NULL); // 新建并初始化一个set\n int err = 0;\n int i;\n if (set == NULL)\n goto error;\n for (i = oparg; i > 0; i--) { // 将传入初始化的参数传入\n PyObject *item = PEEK(i);\n if (err == 0)\n err = PySet_Add(set, item); // 并依次对set进行添加操作\n Py_DECREF(item);\n }\n STACKADJ(-oparg);                // 移动弹栈\n if (err != 0) {\n Py_DECREF(set);\n goto error;\n }\n PUSH(set);                     // 讲set压栈\n DISPATCH();                    // 执行下一条指令\n }\n\n此时继续查看 PySet_New 函数的执行流程;\n源文件:Objects/setobject.c\nPyObject *\nPySet_New(PyObject *iterable)\n{\n return make_new_set(&PySet_Type, iterable);\n}\n\n...\n\n\nstatic PyObject *\nmake_new_set(PyTypeObject *type, PyObject *iterable)\n{\n PySetObject *so;\n\n so = (PySetObject *)type->tp_alloc(type, 0); // 申请该元素的内存\n if (so == NULL) // 内存申请失败则返回为空\n return NULL;\n\n so->fill = 0; // 初始化的时候都为0\n so->used = 0;\n so->mask = PySet_MINSIZE - 1; // PySet_MINSIZE默认我8,mask为7\n so->table = so->smalltable; // 将保存数据的头指针指向table\n so->hash = -1; // 设置hash值为-1\n so->finger = 0;\n so->weakreflist = NULL;\n\n if (iterable != NULL) { // 如果有迭代器\n if (set_update_internal(so, iterable)) { // 将内容更新到so中\n Py_DECREF(so);\n return NULL;\n }\n }\n\n return (PyObject *)so; // 返回初始化完成的set\n}\n\n从 PySet_New 的执行流程可知,字典的初始化过程就是初始化相关数据结构。\nset 的插入\n在本例的初始化过程中,由于传入了初始值 1,2,所以会在执行字节码指令的时候,执行 PySet_Add,该函数的本质与 set_a.add(3)本质都调用了更底层 set_add_key 函数;\n源文件:Objects/setobject.c\n\nint\nPySet_Add(PyObject *anyset, PyObject *key)\n{\n if (!PySet_Check(anyset) &&\n (!PyFrozenSet_Check(anyset) || Py_REFCNT(anyset) != 1)) {\n PyErr_BadInternalCall();\n return -1;\n }\n return set_add_key((PySetObject *)anyset, key); // 向字典中添加key;\n}\n\n继续查看 set_add_key 函数的执行过程;\n源文件:Objects/setobject.c\nstatic int\nset_add_key(PySetObject *so, PyObject *key)\n{\n Py_hash_t hash;\n\n if (!PyUnicode_CheckExact(key) ||\n (hash = ((PyASCIIObject *) key)->hash) == -1) {\n hash = PyObject_Hash(key); // 获取传入值的hash值\n if (hash == -1) // 如果不能hash则返回-1\n return -1;\n }\n return set_add_entry(so, key, hash); // 计算完成后添加值\n}\n\n该函数主要就是检查传入的 key 是否能够被 hash,如果能够被 hash 则直接返回,如果能被 hash 则继续调用 set_add_entry 函数将值加入到 set 中;\n源文件:Objects/setobject.c\n\nstatic int\nset_add_entry(PySetObject *so, PyObject *key, Py_hash_t hash)\n{\n setentry *table;\n setentry *freeslot;\n setentry *entry;\n size_t perturb;\n size_t mask;\n size_t i; /* Unsigned for defined overflow behavior */\n size_t j;\n int cmp;\n\n /* Pre-increment is necessary to prevent arbitrary code in the rich\n comparison from deallocating the key just before the insertion. */\n Py_INCREF(key); // 提高key的引用计数\n\n restart:\n\n mask = so->mask;  // 获取so->mask\n i = (size_t)hash & mask;  // 通过传入的hash与mask求索引下标\n\n entry = &so->table[i];    // 获取索引对应的值\n if (entry->key == NULL) // 如果获取索引的值没有被使用则直接跳转到found_unused处执行\n goto found_unused;\n\n freeslot = NULL;\n perturb = hash;    // perturb设置为当前hash值\n \n while (1) {\n if (entry->hash == hash) { // 如果当前hash值相等\n PyObject *startkey = entry->key;                      // 获取当前key\n /* startkey cannot be a dummy because the dummy hash field is -1 */\n assert(startkey != dummy); // 检查key是否为dummy\n if (startkey == key) // 如果找到的值与传入需要设置的值相同则跳转到found_active处执行\n goto found_active;\n if (PyUnicode_CheckExact(startkey)\n && PyUnicode_CheckExact(key)\n && _PyUnicode_EQ(startkey, key)) // 如果是unicode,通过类型转换检查两个key的内容是否相同,如果不相同则跳转到found_active处\n goto found_active;\n table = so->table; // 如果没有找到,则获取当前table的头部节点\n Py_INCREF(startkey);\n cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);          // 如果是其他类型的对象则调用比较方法去比较两个key是否相同\n Py_DECREF(startkey);\n if (cmp > 0) /* likely */ // 如果找到则跳转到found_active\n goto found_active;\n if (cmp table || entry->key != startkey) // 如果set改变了则重新开始查找\n goto restart;\n mask = so->mask; /* help avoid a register spill */   \n }\n else if (entry->hash == -1)\n freeslot = entry;    // 如果不能hash 则设置freeslot\n\n if (i + LINEAR_PROBES hash == 0 && entry->key == NULL)              // 如果找到当前hash为空或者key为空的则跳转到found_unused_or_dummy处执行\n goto found_unused_or_dummy;\n if (entry->hash == hash) {   // 如果找到的hash值相同\n PyObject *startkey = entry->key; // 获取该值\n assert(startkey != dummy); // 检查是否为dummy\n if (startkey == key) // 如果key相同则跳转到found_active处执行\n goto found_active;\n if (PyUnicode_CheckExact(startkey)\n && PyUnicode_CheckExact(key)\n && _PyUnicode_EQ(startkey, key)) // 检查是否为unicode,并比较如果不相同则跳转到found_active\n goto found_active;\n table = so->table; // 调用key本身的方法比较\n Py_INCREF(startkey);\n cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);\n Py_DECREF(startkey);\n if (cmp > 0)\n goto found_active;\n if (cmp table || entry->key != startkey)\n goto restart;\n mask = so->mask;\n }\n else if (entry->hash == -1)\n freeslot = entry;\n }\n }\n\n perturb >>= PERTURB_SHIFT; // 如果没有找到则获取下一个索引值\n i = (i * 5 + 1 + perturb) & mask; // 右移5位 加上 索引值*5 加1与mask求余获取下一个索引值\n\n entry = &so->table[i]; // 获取下一个元素\n if (entry->key == NULL)               // 如果找到为空则直接跳转到found_unused_or_dummy处\n goto found_unused_or_dummy;\n }\n\n found_unused_or_dummy:\n if (freeslot == NULL)                                  // 检查freeslot是否为空如果为空则跳转到found_unused处执行即找到了dummy位置\n goto found_unused;\n so->used++;                       // 使用数加1\n freeslot->key = key;                                   // 设置key与hash值\n freeslot->hash = hash;\n return 0;\n\n found_unused:\n so->fill++;                                        // 使用总数加1\n so->used++;                                        // 使用总数加1 \n entry->key = key;                                     // 设置key与hash值\n entry->hash = hash;\n if ((size_t)so->fill*5 used>50000 ? so->used*2 : so->used*4);    // 如果已使用的总数大于3/5则重新调整table,如果set使用的总数超过了50000则扩展为以前的2倍否则就是四倍\n\n found_active:\n Py_DECREF(key);                                      // 如果找到了该值 则什么也不做\n return 0;\n\n comparison_error:\n Py_DECREF(key);                                      // 如果比较失败则返回-1\n return -1;\n}\n\n此时基本的流程就是通过传入的 hash 值,如果计算出的索引值,没有值,则直接将该值存入对应的 entry 中,如果相同则不插入,如果索引对应的值且值不同,则遍历从该索引往后9个位置的值,依次找到有空余位置的值,并将该值设置进去。如果设置该值之后使用的数量占总的申请数量超过了 3/5 则重新扩充 set,扩充的原则就是如果当前的 set->used>50000 就进行两倍扩充否则就进行四倍扩充。\n插入的概述如下,默认 s 初始化为空;\ns.add(1) // index = 1 & 7 = 1\n\n\ns.add(2) // index = 2 & 7 = 2\n\n\ns.add(7) // index = 9 & 7 = 1\n\n\n大致的 set 的插入过程执行完毕。\nset 的删除\nset 的删除操作主要集中在 set_remove()函数上,如下示例;\n源文件:Objects/setobject.c\n\nstatic PyObject *\nset_remove(PySetObject *so, PyObject *key)\n{\n PyObject *tmpkey;\n int rv;\n\n rv = set_discard_key(so, key); // 将该key设置为dummy\n if (rv \n此时就会调用 set_discard_key 方法来讲对应的 entry 设置为 dummy;set_discard_key 方法如下;\n源文件:Objects/setobject.c\n\nstatic int\nset_discard_key(PySetObject *so, PyObject *key)\n{\n Py_hash_t hash;\n\n if (!PyUnicode_CheckExact(key) ||\n (hash = ((PyASCIIObject *) key)->hash) == -1) {\n hash = PyObject_Hash(key);  // 检查是否可用hash如果可用则调用set_discard_entry方法\n if (hash == -1)\n return -1;\n }\n return set_discard_entry(so, key, hash);\n}\n\n该函数主要就是做了检查 key 是否可用 hash 的检查,此时如果可用 hash 则调用 set_discard_entry 方法;\n源文件:Objects/setobject.c\n\nstatic int\nset_discard_entry(PySetObject *so, PyObject *key, Py_hash_t hash)\n{\n setentry *entry;\n PyObject *old_key;\n\n entry = set_lookkey(so, key, hash);      // 查找该值 set_lookkey该方法与插入的逻辑类似大家可自行查看\n if (entry == NULL)                 // 如果没有找到则返回-1\n return -1;\n if (entry->key == NULL)\n return DISCARD_NOTFOUND;           // 找到entry而key为空则返回notfound\n old_key = entry->key; // 找到正常值则讲该值对应的entry设置为dummy\n entry->key = dummy;\n entry->hash = -1; // hash值为-1\n so->used--; // 使用数量减1 但是fill数量未变\n Py_DECREF(old_key);                 // 减少该对象引用\n return DISCARD_FOUND;                // 返回返现\n}\n\n此时就是查找该值,如果找到该值并将该值设置为 dummy,并且将 used 值减1,此处没有减去 fill 的数量,从此处可知,fill 包括所有曾经申请过的数量。\nset 的 resize\nset 的 resize 主要依靠 set_table_reseize 函数来实现;\n源文件:Objects/setobject.c\nstatic int\nset_table_resize(PySetObject *so, Py_ssize_t minused)\n{\n setentry *oldtable, *newtable, *entry;\n Py_ssize_t oldmask = so->mask; // 设置旧的mask\n size_t newmask;\n int is_oldtable_malloced;\n setentry small_copy[PySet_MINSIZE]; // 最小的拷贝数组\n\n assert(minused >= 0);\n\n /* Find the smallest table size > minused. */\n /* XXX speed-up with intrinsics */\n size_t newsize = PySet_MINSIZE;\n while (newsize table;                   // 先获取旧的table\n assert(oldtable != NULL);\n is_oldtable_malloced = oldtable != so->smalltable;\n\n if (newsize == PySet_MINSIZE) {                  // 如果获取的新大小与PySet_MINSIZE的大小相同\n /* A large table is shrinking, or we can't get any smaller. */\n newtable = so->smalltable;                  // 获取新table的地址\n if (newtable == oldtable) {                 // 如果相同\n if (so->fill == so->used) {              // 如果使用的相同则什么都不做\n /* No dummies, so no point doing anything. */\n return 0;\n }\n /* We're not going to resize it, but rebuild the\n table anyway to purge old dummy entries.\n Subtle: This is *necessary* if fill==size,\n as set_lookkey needs at least one virgin slot to\n terminate failing searches. If fill fill > so->used);\n memcpy(small_copy, oldtable, sizeof(small_copy)); // 将数据拷贝到set_lookkey中\n oldtable = small_copy;                  \n }\n }\n else {\n newtable = PyMem_NEW(setentry, newsize); // 新申请内存\n if (newtable == NULL) {                     // 如果为空则申请内存失败报错\n PyErr_NoMemory();\n return -1;\n }\n }\n\n /* Make the set empty, using the new table. */\n assert(newtable != oldtable); // 检查新申请的与就table不同\n memset(newtable, 0, sizeof(setentry) * newsize);        // 新申请的内存置空\n so->mask = newsize - 1; // 设置新的size\n so->table = newtable; // 重置table指向新table\n\n /* Copy the data over; this is refcount-neutral for active entries;\n dummy entries aren't copied over, of course */\n newmask = (size_t)so->mask; // 获取新的mask\n if (so->fill == so->used) { // 如果使用的与曾经使用的数量相同\n for (entry = oldtable; entry key != NULL) {\n set_insert_clean(newtable, newmask, entry->key, entry->hash);  // 如果值不为空则插入到新的table中\n }\n }\n } else {\n so->fill = so->used;                        // 如果不相同则重置fill为used的值\n for (entry = oldtable; entry key != NULL && entry->key != dummy) {     // 检查如果不为dummy并且key不为空的情况下\n set_insert_clean(newtable, newmask, entry->key, entry->hash);  // 重新插入该列表该值\n }\n }\n }\n\n if (is_oldtable_malloced)                       // 如果两个表相同则删除旧table\n PyMem_DEL(oldtable);\n return 0; // 返回0\n}\n\n主要是检查是否 table 相同并且需要重新 resize 的值,然后判断是否 fill 与 used 相同,如果相同则全部插入,如果不同,则遍历旧 table 讲不为空并且不为 dummy 的值插入到新表中;\n源文件:Objects/setobject.c\nstatic void\nset_insert_clean(setentry *table, size_t mask, PyObject *key, Py_hash_t hash)\n{\n setentry *entry;\n size_t perturb = hash;\n size_t i = (size_t)hash & mask;         // 计算索引\n size_t j;\n\n while (1) {\n entry = &table[i]; // 获取当前entry\n if (entry->key == NULL) // 如果为空则跳转值found_null设置key与hash\n goto found_null;\n if (i + LINEAR_PROBES key == NULL) // 如果为空则跳转到found_null\n goto found_null;\n }\n }\n perturb >>= PERTURB_SHIFT; // 计算下一个索引值继续寻找\n i = (i * 5 + 1 + perturb) & mask;\n }\n found_null:\n entry->key = key;\n entry->hash = hash;\n}\n\nset 的 resize 的操作基本如上所述。\nCopyright © FlagGo 2019 all right reserved,powered by Gitbook该文件修订时间:\n2020-03-23 19:36:27\n"},"objects/simple-interpreter/":{"url":"objects/simple-interpreter/","title":"实现简版 Python","keywords":"","body":"Python 字符串 对象\nCopyright © FlagGo 2019 all right reserved,powered by Gitbook该文件修订时间:\n2020-03-23 19:36:27\n"}}} \ No newline at end of file diff --git a/search_plus_index.json b/search_plus_index.json new file mode 100644 index 0000000..0b712ce --- /dev/null +++ b/search_plus_index.json @@ -0,0 +1 @@ +{"./":{"url":"./","title":"前言","keywords":"","body":"介绍 本项目致力于对 Python 3.7 的源码分析,深度参考陈儒大大的《Python 源码剖析》,编写 Python 3 的版本。 希望各位 Python 爱好者能参与其中,一起探索 Python 魔法背后的奥秘! 使用 您可以直接访问 在线版,或者根据以下步骤访问本地版。 前置条件 您的系统上需要安装好 node (会自带npm)。 使用 make 或者使用 npm 命令去构建 使用 make 命令的方式构建: 若您可使用 make 命令,简单执行如下命令进行初始化: make init 执行如下命令运行服务端: make run 使用 npm 命令的方式构建: 若您不能使用 make 命令,或想直接使用 npm 命令,执行如下命令进行初始化: 安装项目依赖: npm install 执行如下命令运行服务端: npm run serve 访问 直接访问 http://localhost:4000 即可查看本书内容。 Roadmap 大体按照《Python 源码剖析》中的目录结构进行编写。依次介绍 Python 源码基本信息、内建对象和虚拟机。 [x] 章节 [x] 序章 [x] 前言 [x] Python 源代码的组织 [x] Windows 环境下编译 Python [x] UNIX/Linux 环境下编译 Python [x] 修改 Python 源码 [ ] Python 内建对象 [x] Python 对象初探 [x] Python 整数对象 [ ] Python 字符串 对象 [x] Python List 对象 [x] Python Dict 对象 [x] Python Set 对象 [ ] 实现简版 Python [ ] Python 虚拟机 [ ] Python 编译结果 [ ] Python 虚拟机框架 [ ] 虚拟机一般表达式 [ ] Python 虚拟机控制流 [ ] Python 虚拟机函数机制 [ ] Python 运行环境初始化 [ ] Python 模块加载机制 [ ] Python 多线程机制 [ ] Python 内存管理机制 Copyright © FlagGo 2019 all right reserved,powered by Gitbook该文件修订时间: 2020-03-23 19:36:27 "},"preface/code-organization/":{"url":"preface/code-organization/","title":"Python 源代码的组织","keywords":"","body":"Python 源代码的组织 源代码下载 方式 1:GitHub Python 源代码可以在 GitHub 上方便的获取,执行: git clone https://github.com/python/cpython.git git checkout v3.7.0 即可获取 Python 3.7.0 版本的代码。 方式 2:Python 官方网站 访问 https://www.python.org/downloads/release/python-370/ ,下拉至页面最下方,可选择下载 tarball 源码包。 亦可执行: wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz 即可获取 Python 3.7.0 版本的代码。 目录结构 进入源码目录,我们可以看到该目录下主要 包含以下文件(夹): . ├── Doc ├── Grammar ├── Include ├── LICENSE ├── Lib ├── Mac ├── Makefile.pre.in ├── Misc ├── Modules ├── Objects ├── PC ├── PCbuild ├── Parser ├── Programs ├── Python ├── README.rst ├── Tools ├── aclocal.m4 ├── config.guess ├── config.sub ├── configure ├── configure.ac ├── install-sh ├── m4 ├── pyconfig.h.in └── setup.py 其中: Include 目录:包含了 Python 提供的所有头文件,如果用户需要自己用 C 或 C++来编写自定义模块扩展 Python,那么就需要用到这里提供的头文件。 Lib 目录:包含了 Python 自带的所有标准库,且都是用 Python 语言编写的。 Modules 目录:包含了所有用 C 语言编写的模块,比如 math、hashlib 等。它们都是那些对速度要求非常严格的模块。而相比而言,Lib 目录下则是存放一些对速度没有太严格要求的模块,比如 os。 Parser 目录:包含了 Python 解释器中的 Scanner 和 Parser 部分,即对 Python 源代码进行词法分析和语法分析的部分。除此以外,此目录还包含了一些有用的工具,这些工具能够根据 Python 语言的语法自动生成 Python 语言的词法和语法分析器,与 YACC 非常类似。 Objects 目录:包含了所有 Python 的内建对象,包括整数、list、dict 等。同时,该目录还包括了 Python 在运行时需要的所有的内部使用对象的实现。 Python 目录:包含了 Python 解释器中的 Compiler 和执行引擎部分,是 Python 运行的核心所在。 PCbuild 目录:包含了 Visual Studio 2003 的工程文件,研究 Python 源代码就从这里开始(本书将采用 Visual Studio 2017 对 Python 进行编译)。 Programs 目录:包含了 Python 二进制可执行文件的源码。 Copyright © FlagGo 2019 all right reserved,powered by Gitbook该文件修订时间: 2020-03-23 19:36:27 "},"preface/windows-build/":{"url":"preface/windows-build/","title":"Windows 环境下编译 Python","keywords":"","body":"Windows 环境下编译 Python 在 Windows 环境下编译 Python 可完全通过界面操作,主要分为两个步骤: 环境准备 编译 环境准备 在 Python 3.6 及之后的版本可以使用微软的 Visual Studio 2017 进行编译,选择社区版就足够了。 在下载完成后,需要注意安装环节的选项。由于 Python 3.7 所使用的 Windows SDK 的版本为 10.0.17134.0, 所以需要选择安装该 SDK,如下图所示: 编译 进入 Python 源码根目录,打开 PCbuild\\pcbiuld.sln 解决方案,而后进行一些设置: 在左侧的解决方案目录的顶端,右键选择“属性”,以打开属性界面(如下图所示)。 由于我们只是研究 Python 的核心部分,可以选择不编译标准库和外部依赖,在“配置属性”->“配置”中仅勾选 python 和 pythoncore,然后点击“确定”(如下图所示)。 此外,默认情况下的编译设置是 Debug、32 位,您也可以根据自己的需求调整成 Release 或 64 位。 在左侧的解决方案目录中选择 python,右键选择“生成”,以进行编译: 编译结束后,生成的文件存放在PCbuild\\win32目录下(如下图所示),打开python_d即可打开新生成的 Python 3.7 解释器。 更多内容 更多关于在 Windows 上进行编译和开发 Python 的内容见官方指南 Copyright © FlagGo 2019 all right reserved,powered by Gitbook该文件修订时间: 2020-03-23 19:36:27 "},"preface/unix-linux-build/":{"url":"preface/unix-linux-build/","title":"UNIX/Linux 环境下编译 Python","keywords":"","body":"UNIX/Linux 环境下编译 Python 在 UNIX/Linux 环境下编译 Python 较为简单,主要分为两个步骤: 环境准备(准备 Python 所依赖的必要环境) 编译、安装 环境准备 常规操作系统中 编译 Python 前通常需要在系统上安装以下库: gcc // 编译工具 zlib // 压缩、解压相关库 libffi // Python 所以来的用于支持 C 扩展的库 openssl // 安全套接字层密码库,Linux 中通常已具备 不同的发行版,安装方式和包名称也不尽相同。 对于 Debian/Ubuntu,执行: sudo apt install -y zlib1g zlib1g-dev libffi-dev openssl libssl-dev 对于 RedHat/CentOS/Fedora,执行: yum install -y zlib zlib-devel libffi-devel openssl openssl-devel 对于 macOS,执行: xcode-select --install 运行于 Docker 的操作系统中 Docker 版的 Linux 发行版可能会有较多的库未安装,除了安装上一小节提及的库外,其他缺失库可根据情况自行安装: bzip2 // 压缩库 readline // GNU Readline 是一个软件库,它为使用命令行界面(如 Bash)的交互式程序提供了行编辑和历史功能 sqlite // 由 C 编写的小型数据库 libuuid // 跨平台的开源的 uuid 操作库 gdbm // 小型的数据库系统 xz // 压缩解压工具 tk-devel // 图形用户界面开发工具 对于 Debian/Ubuntu,执行: sudo apt-get install bzip2 libbz2-dev sqlite3 libsqlite3-dev libreadline6 libreadline6-dev libgdbm-dev uuid-dev tk-dev 对于 RedHat/CentOS/Fedora,执行: yum install bzip2 bzip2-devel readline-devel sqlite-devel libuuid-devel gdbm-devel xz-devel tk-devel 编译、安装 进入 Python 源码根目录,执行以下命令: ./configure make make install Python 将会被编译,并安装在默认目录中。若您希望将 Python 安装在特定目录,则需要在一开始修改 configure 命令为: ./configure --prefix= 在指定目录中: bin 目录 存放的是可执行文件 include 目录 存放的是 Python 源码的头文件 lib 目录 存放的是 Python 标准库 lib/python3.7/config-3.7m-{platform} 目录 存放的是 libpython3.7m.a,该静态库用于使用 C 语言进行扩展。{platform} 代表平台,比如在 Mac OS 上为 “darwin”,在 Linux 上为 “x86_64-linux-gnu” share 目录 存放的是帮助等文件 默认情况下,编译的 Python 是静态链接(libpython3.7m.a)。如果希望编译的 Python 是动态链接(libpython3.7m.so),则需要在一开始修改configure 命令为: ./configure --enable-shared 如需重新编译,请首先执行: make clean 再执行本节开头处的命令即可。 Copyright © FlagGo 2019 all right reserved,powered by Gitbook该文件修订时间: 2020-03-23 19:36:27 "},"preface/modify-code/":{"url":"preface/modify-code/","title":"修改 Python 源码","keywords":"","body":"修改 Python 源码 在源代码中 Print 在接下来研究源码的过程中,我们可能会对某些语句的逻辑感到好奇,需要输出中间结果。 这就需要借助 Python C API 中打印对象的接口: 源文件:Objects/object.c int PyObject_Print(PyObject *op, FILE *fp, int flags) 比如,我们希望在解释器交互界面中打印整数值的时候输出一段字符串,则我们可以修改如下函数: 源文件:Objects/longobject.c static PyObject * long_to_decimal_string(PyObject *aa) { PyObject *str = PyUnicode_FromString(\"I am always before int\"); PyObject_Print(str, stdout, 0); printf(\"\\n\"); PyObject *v; if (long_to_decimal_string_internal(aa, &v, NULL, NULL, NULL) == -1) return NULL; return v; } 函数实现中的前 3 行为我们加入的代码,其中: PyUnicode_FromString 用于把 C 中的原生字符数组转换为出 Python 中的字符串(Unicode)对象 PyObject_Print 则将转换好的字符串对象打印至我们指定的标准输出(stdout) 对 Python 重新进行编译,在 Unix 上可执行: make && make bininstall 运行编译后的 Python,输入 print 语句即可看到我们希望的结果: >>> print(1) 'I am always before int' 1 Copyright © FlagGo 2019 all right reserved,powered by Gitbook该文件修订时间: 2020-03-23 19:36:27 "},"objects/object/":{"url":"objects/object/","title":"Python 对象初探","keywords":"","body":"Python 对象初探 在 Python 的世界一切皆对象,不论是整数,还是字符串,甚至连类型、函数等都是一种对象。 对象的分类 以下是 Python 对象的大致的一个分类 Fundamental 对象: 类型对象 Numeric 对象: 数值对象 Sequence 对象: 容纳其他对象的序列集合对象 Mapping 对象: 类似 C++中的 map 的关联对象 Internal 对象: Python 虚拟机在运行时内部使用的对象 对象机制的基石 PyObject 对于初学者来说这么多类型的对象怎么学?别着急,我们后续章节会解答。 在开始我们的学习之旅之前,我们要先认识一个结构体PyObject,可以说 Python 的对象机制就是基于PyObject拓展开来的,所以我们先看看PyObject 到底长什么样。 源文件:Include/object.h // Include/object.h #define _PyObject_HEAD_EXTRA \\ struct _object *_ob_next; \\ struct _object *_ob_prev; typedef struct _object { _PyObject_HEAD_EXTRA // 双向链表 垃圾回收 需要用到 Py_ssize_t ob_refcnt; // 引用计数 struct _typeobject *ob_type; // 指向类型对象的指针,决定了对象的类型 } PyObject; Python 中的所有对象都拥有一些相同的内容,而这些内容就定义在PyObject中, PyObject 包含 一个用于垃圾回收的双向链表,一个引用计数变量 ob_refcnt 和 一个类型对象指针ob_type 定长对象与变长对象 Python 对象除了前面提到的那种分类方法外,还可以分为定长对象和变长对象这两种形式。 变长对象都拥有一个相同的内容 PyVarObject,而 PyVarObject也是基于PyObject扩展的。 从代码中可以看出PyVarObject比PyObject多出了一个用于存储元素个数的变量ob_size。 源文件:Include/object.h // Include/object.h typedef struct _object { _PyObject_HEAD_EXTRA Py_ssize_t ob_refcnt; struct _typeobject *ob_type; } PyObject; typedef struct { PyObject ob_base; Py_ssize_t ob_size; /* Number of items in variable part */ } PyVarObject; 类型对象 前面我们提到了PyObject 的 对象类型指针struct _typeobject *ob_type,它指向的类型对象就决定了一个对象是什么类型的。 这是一个非常重要的结构体,它不仅仅决定了一个对象的类型,还包含大量的元信息, 包括创建对象需要分配多少内存,对象都支持哪些操作等等。 接下来我们看一下struct _typeobject代码 在 PyTypeObject 的定义中包含许多信息,主要分类以下几类: 类型名, tp_name, 主要用于 Python 内部调试用 创建该类型对象时分配的空间大小信息,即 tp_basicsize 和 tp_itemsize 与该类型对象相关的操作信息(如 tp_print 这样的函数指针) 一些对象属性 源文件:Include/object.h // Include/object.h typedef struct _typeobject { PyObject_VAR_HEAD const char *tp_name; /* For printing, in format \".\" */ // 类型名 Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */ // 创建该类型对象分配的内存空间大小 // 一堆方法定义,函数和指针 /* Methods to implement standard operations */ destructor tp_dealloc; printfunc tp_print; getattrfunc tp_getattr; setattrfunc tp_setattr; PyAsyncMethods *tp_as_async; /* formerly known as tp_compare (Python 2) or tp_reserved (Python 3) */ reprfunc tp_repr; /* Method suites for standard classes */ // 标准类方法集 PyNumberMethods *tp_as_number; // 数值对象操作 PySequenceMethods *tp_as_sequence; // 序列对象操作 PyMappingMethods *tp_as_mapping; // 字典对象操作 // 更多标准操作 /* More standard operations (here for binary compatibility) */ hashfunc tp_hash; ternaryfunc tp_call; reprfunc tp_str; getattrofunc tp_getattro; setattrofunc tp_setattro; ...... } PyTypeObject; 类型的类型 在 PyTypeObjet 定义开始有一个宏PyOject_VAR_HEAD,查看源码可知 PyTypeObjet 是一个变长对象 源文件:Include/object.h // Include/object.h #define PyObject_VAR_HEAD PyVarObject ob_base; 对象的类型是由该对象指向的 类型对象 决定的,那么类型对象的类型是由谁决定的呢? 对于其他对象,可以通过与其关联的类型对象确定其类型,那么通过什么来确定一个对象是类型对象呢? 答案就是 PyType_Type 源文件:Objects/typeobject.c // Objects/typeobject.c PyTypeObject PyType_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) \"type\", /* tp_name */ sizeof(PyHeapTypeObject), /* tp_basicsize */ sizeof(PyMemberDef), /* tp_itemsize */ ...... }; PyType_Type 在类型机制中至关重要,所有用户自定义 class 所 对应的 PyTypeObject 对象都是通过 PyType_Type创建的 接下来我们看 PyLong_Type 是怎么与 PyType_Type 建立联系的。 前面提到,在 Python 中,每一个对象都将自己的引用计数、类型信息保存在开始的部分中。 为了方便对这部分内存初始化,Python 中提供了几个有用的宏: 源文件:Include/object.h // Include/object.h #ifdef Py_TRACE_REFS #define _PyObject_EXTRA_INIT 0, 0, #else #define _PyObject_EXTRA_INIT #endif #define PyObject_HEAD_INIT(type) \\ { _PyObject_EXTRA_INIT \\ 1, type }, 这些宏在各种内建类型对象的初始化中被大量使用。 以PyLong_Type为例,可以清晰的看到一般的类型对象和PyType_Type之间的关系 源文件:Objects/longobject.c // Objects/longobject.c PyTypeObject PyLong_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) \"int\", /* tp_name */ offsetof(PyLongObject, ob_digit), /* tp_basicsize */ sizeof(digit), /* tp_itemsize */ ...... }; 下图是对象运行时的图像表现 对象的创建 Python 创建对象有两种方式 范型 API 或称为 AOL (Abstract Object Layer) 这类 API 通常形如PyObject_XXX这样的形式。可以应用在任何 Python 对象上, 如PyObject_New。创建一个整数对象的方式 PyObject* longobj = PyObject_New(Pyobject, &PyLong_Type); 与类型相关的 API 或称为 COL (Concrete Object Layer) 这类 API 通常只能作用于某一种类型的对象上,对于每一种内建对象 Python 都提供了这样一组 API。例如整数对象,我们可以利用如下的 API 创建 PyObject *longObj = PyLong_FromLong(10); 对象的行为 在 PyTypeObject 中定义了大量的函数指针。这些函数指针可以视为类型对象中 所定义的操作,这些操作直接决定着一个对象在运行时所表现出的行为,比如 PyTypeObject 中的 tp_hash 指明了该类型对象如何生成其hash值。 在PyTypeObject的代码中,我们还可以看到非常重要的三组操作族 PyNumberMethods *tp_as_number PySequenceMethods *tp_as_sequence PyMappingMethods *tp_as_mapping PyNumberMethods 的代码如下 源文件:Include/object.h // Include/object.h typedef PyObject * (*binaryfunc)(PyObject *, PyObject *); typedef struct { binaryfunc nb_matrix_multiply; binaryfunc nb_inplace_matrix_multiply; ...... } PyNumberMethods; PyNumberMethods 定义了一个数值对象该支持的操作。一个数值对象如 整数对象,那么它的类型对象 PyLong_Type中tp_as_number.nb_add 就指定了它进行加法操作时的具体行为。 在以下代码中可以看出PyLong_Type中的tp_as_number项指向的是long_as_number 源文件:Objects/longobject.h // Objects/longobject.c static PyNumberMethods long_as_number = { (binaryfunc)long_add, /*nb_add*/ (binaryfunc)long_sub, /*nb_subtract*/ (binaryfunc)long_mul, /*nb_multiply*/ ...... }; PyTypeObject PyLong_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) \"int\", /* tp_name */ offsetof(PyLongObject, ob_digit), /* tp_basicsize */ sizeof(digit), /* tp_itemsize */ long_dealloc, /* tp_dealloc */ 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_reserved */ long_to_decimal_string, /* tp_repr */ &long_as_number, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ ...... }; PySequenceMethods *tp_as_sequence 和 PyMappingMethods *tp_as_mapping的分析与PyNumberMethods *tp_as_number 相同,大家可以自行查阅源码 对象的多态性 Python 创建一个对象比如 PyLongObject 时,会分配内存进行初始化,然后 Python 内部会用 PyObject* 变量来维护这个对象,其他对象也与此类似 所以在 Python 内部各个函数之间传递的都是一种范型指针 PyObject* 我们不知道这个指针所指的对象是什么类型,只能通过所指对象的 ob_type 域 动态进行判断,而 Python 正是通过 ob_type 实现了多态机制 考虑以下的 calc_hash 函数 Py_hash_t calc_hash(PyObject* object) { Py_hash_t hash = object->ob_type->tp_hash(object); return hash; } 如果传递给 calc_hash 函数的指针是一个 PyLongObject*,那么它会调用 PyLongObject 对象对应的类型对象中定义的 hash 操作tp_hash,tp_hash可以在PyTypeObject中找到, 而具体赋值绑定我们可以在 PyLong_Type 初始化代码中看到绑定的是long_hash函数 源文件:Objects/longobject.c // Objects/longobject.c PyTypeObject PyLong_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) \"int\", /* tp_name */ ... (hashfunc)long_hash, /* tp_hash */ ... }; 如果指针是一个 PyUnicodeObject*,那么就会调用 PyUnicodeObject 对象对应的类型对象中定义的 hash 操作,查看源码可以看到 实际绑定的是 unicode_hash函数 源文件:Objects/unicodeobject.c // Objects/unicodeobject.c PyTypeObject PyUnicode_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) \"str\", /* tp_name */ ... (hashfunc) unicode_hash, /* tp_hash*/ ... }; 引用计数 Python 通过引用计数来管理维护对象在内存中的存在与否 Python 中的每个东西都是一个对象, 都有ob_refcnt 变量,这个变量维护对象的引用计数,从而最终决定该对象的创建与销毁 在 Python 中,主要通过 Py_INCREF(op)与Py_DECREF(op) 这两个宏 来增加和减少对一个对象的引用计数。当一个对象的引用计数减少到 0 之后, Py_DECREF将调用该对象的tp_dealloc来释放对象所占用的内存和系统资源; 但这并不意味着最终一定会调用 free 释放内存空间。因为频繁的申请、释放内存会大大降低 Python 的执行效率。因此 Python 中大量采用了内存对象池的技术,使得对象释放的空间归还给内存池而不是直接free,后续使用可先从对象池中获取 源文件:Include/object.h // Include/object.h #define _Py_NewReference(op) ( \\ _Py_INC_TPALLOCS(op) _Py_COUNT_ALLOCS_COMMA \\ _Py_INC_REFTOTAL _Py_REF_DEBUG_COMMA \\ Py_REFCNT(op) = 1) #define Py_INCREF(op) ( \\ _Py_INC_REFTOTAL _Py_REF_DEBUG_COMMA \\ ((PyObject *)(op))->ob_refcnt++) #define Py_DECREF(op) \\ do { \\ PyObject *_py_decref_tmp = (PyObject *)(op); \\ if (_Py_DEC_REFTOTAL _Py_REF_DEBUG_COMMA \\ --(_py_decref_tmp)->ob_refcnt != 0) \\ _Py_CHECK_REFCNT(_py_decref_tmp) \\ else \\ _Py_Dealloc(_py_decref_tmp); \\ } while (0) Copyright © FlagGo 2019 all right reserved,powered by Gitbook该文件修订时间: 2020-03-23 19:36:27 "},"objects/long-object/":{"url":"objects/long-object/","title":"Python 整数对象","keywords":"","body":"Python 整数对象 CPython2 的整数对象 有 PyIntObject 和 PyLongObject 这两种类型, CPython3 只保留了 PyLongObject 在 源文件:Objects/longobject.c 的第三行有这么一句话 XXX The functional organization of this file is terrible 可见这个变化不是一蹴而就的,有比较艰辛的过程,大家有兴趣可以去挖掘一下 PyLongObject 源文件:Include/longobject.h // longobject.h typedef struct _longobject PyLongObject; /* Revealed in longintrepr.h */ 源文件:Include/longintrepr.h // longintrepr.h /* Long integer representation. The absolute value of a number is equal to 一个数的绝对值等价于下面的表达式 SUM(for i=0 through abs(ob_size)-1) ob_digit[i] * 2**(SHIFT*i) Negative numbers are represented with ob_size 从源码可以看出 PyLongObject 是变长对象 类型对象 PyLong_Type 源文件:Objects/longobject.c // Objects/longobject.c PyTypeObject PyLong_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) \"int\", /* tp_name */ offsetof(PyLongObject, ob_digit), /* tp_basicsize */ sizeof(digit), /* tp_itemsize */ long_dealloc, /* tp_dealloc */ 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_reserved */ long_to_decimal_string, /* tp_repr */ &long_as_number, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ (hashfunc)long_hash, /* tp_hash */ 0, /* tp_call */ long_to_decimal_string, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_LONG_SUBCLASS, /* tp_flags */ long_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ long_richcompare, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ long_methods, /* tp_methods */ 0, /* tp_members */ long_getset, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ long_new, /* tp_new */ PyObject_Del, /* tp_free */ }; 创建整数对象 从 PyLong_Type 可以看出,创建一个整数对象的入口函数为 long_new 源文件:Objects/clinic/longobject.c.h // Objects/clinic/longobject.c.h /*[clinic input] preserve [clinic start generated code]*/ static PyObject * long_new_impl(PyTypeObject *type, PyObject *x, PyObject *obase); static PyObject * long_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) { PyObject *return_value = NULL; static const char * const _keywords[] = {\"\", \"base\", NULL}; static _PyArg_Parser _parser = {\"|OO:int\", _keywords, 0}; PyObject *x = NULL; PyObject *obase = NULL; if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser, &x, &obase)) { goto exit; } return_value = long_new_impl(type, x, obase); exit: return return_value; } 具体实现在 long_new_impl 源文件:Objects/longobject.c // Objects/longobject.c /*[clinic input] @classmethod int.__new__ as long_new x: object(c_default=\"NULL\") = 0 / base as obase: object(c_default=\"NULL\") = 10 [clinic start generated code]*/ static PyObject * long_new_impl(PyTypeObject *type, PyObject *x, PyObject *obase) /*[clinic end generated code: output=e47cfe777ab0f24c input=81c98f418af9eb6f]*/ { Py_ssize_t base; if (type != &PyLong_Type) return long_subtype_new(type, x, obase); /* Wimp out */ if (x == NULL) { if (obase != NULL) { PyErr_SetString(PyExc_TypeError, \"int() missing string argument\"); return NULL; } return PyLong_FromLong(0L); } if (obase == NULL) return PyNumber_Long(x); base = PyNumber_AsSsize_t(obase, NULL); if (base == -1 && PyErr_Occurred()) return NULL; if ((base != 0 && base 36) { PyErr_SetString(PyExc_ValueError, \"int() base must be >= 2 and 从 long_new_impl 函数可以看出有如下几种情况 x == NULL 且 obase != NULL 调用 PyLong_FromLong obase 为 NULL 调用 PyNumber_Long x 和 obase 都不为 NULL PyUnicode 调用 PyLong_FromUnicodeObject,最终调用 PyLong_FromString PyByteArray/PyBytes 调用_PyLong_FromBytes,最终调用 PyLong_FromString 小整数对象 一些整数在一开始就会被初始化一直留存,当再次使用直接从小整数对象池中获取,不用频繁的申请内存。 默认的小整数范围是 [-5, 257) 源文件:Objects/longobject.c // Objects/longobject.c #ifndef NSMALLPOSINTS #define NSMALLPOSINTS 257 #endif #ifndef NSMALLNEGINTS #define NSMALLNEGINTS 5 #endif #if NSMALLNEGINTS + NSMALLPOSINTS > 0 /* Small integers are preallocated in this array so that they can be shared. The integers that are preallocated are those in the range -NSMALLNEGINTS (inclusive) to NSMALLPOSINTS (not inclusive). */ static PyLongObject small_ints[NSMALLNEGINTS + NSMALLPOSINTS]; #ifdef COUNT_ALLOCS Py_ssize_t quick_int_allocs, quick_neg_int_allocs; #endif static PyObject * get_small_int(sdigit ival) { PyObject *v; assert(-NSMALLNEGINTS = 0) quick_int_allocs++; else quick_neg_int_allocs++; #endif return v; } #define CHECK_SMALL_INT(ival) \\ do if (-NSMALLNEGINTS 宏 CHECK_SMALL_INT 会检查传入的数是否在小整数范围内,如果是直接返回。 可以在创建或复制整数对象等函数中找到 CHECK_SMALL_INT 的身影,以下只列出了 PyLong_FromLong,就不一一列举了 源文件:Objects/longobject.c // Object/longobject.c PyObject * PyLong_FromLong(long ival) { PyLongObject *v; unsigned long abs_ival; unsigned long t; /* unsigned so >> doesn't propagate sign bit */ int ndigits = 0; int sign; CHECK_SMALL_INT(ival); ... } 小整数初始化 源文件:Objects/longobject.c // Objects/longobject.c int _PyLong_Init(void) { #if NSMALLNEGINTS + NSMALLPOSINTS > 0 int ival, size; PyLongObject *v = small_ints; for (ival = -NSMALLNEGINTS; ival ob_digit[0] == (digit)abs(ival)); } else { (void)PyObject_INIT(v, &PyLong_Type); } Py_SIZE(v) = size; v->ob_digit[0] = (digit)abs(ival); } #endif _PyLong_Zero = PyLong_FromLong(0); if (_PyLong_Zero == NULL) return 0; _PyLong_One = PyLong_FromLong(1); if (_PyLong_One == NULL) return 0; /* initialize int_info */ if (Int_InfoType.tp_name == NULL) { if (PyStructSequence_InitType2(&Int_InfoType, &int_info_desc) 整数的存储结构 源文件:Objects/longobject.c 在 long_to_decimal_string_internal中添加如下代码并重新编译安装 // Objects/longobject.c static int long_to_decimal_string_internal(PyObject *aa, PyObject **p_output, _PyUnicodeWriter *writer, _PyBytesWriter *bytes_writer, char **bytes_str) { PyLongObject *scratch, *a; PyObject *str = NULL; Py_ssize_t size, strlen, size_a, i, j; digit *pout, *pin, rem, tenpow; int negative; int d; enum PyUnicode_Kind kind; a = (PyLongObject *)aa; // 添加打印代码 printf(\"ob_size = %d\\n\", Py_SIZE(a)); for (int index = 0; index ob_digit[index]); } ... } 编译安装后进入 python 解释器输入如下代码 num = 9223372043297226753 print(num) # output >>> ob_size = 3 >>> ob_digit[0] = 1 >>> ob_digit[1] = 6 >>> ob_digit[2] = 8 >>> 9223372043297226753 如下图所示 注:这里的 30 是由 PyLong_SHIFT 决定的,64 位系统中,PyLong_SHIFT 为 30,否则 PyLong_SHIFT 为 15 整数对象的数值操作 可以看到整数对象的数值操作较多,由于篇幅限制无法一一分析,这里只分析整数的部分操作 源文件:Objects/longobject.c // Objects/longobject.c static PyNumberMethods long_as_number = { (binaryfunc)long_add, /*nb_add 加法 */ (binaryfunc)long_sub, /*nb_subtract 减法 */ (binaryfunc)long_mul, /*nb_multiply 乘法 */ long_mod, /*nb_remainder 取余 */ long_divmod, /*nb_divmod */ long_pow, /*nb_power 求幂 */ (unaryfunc)long_neg, /*nb_negative */ (unaryfunc)long_long, /*tp_positive */ (unaryfunc)long_abs, /*tp_absolute 绝对值 */ (inquiry)long_bool, /*tp_bool 求bool值 */ (unaryfunc)long_invert, /*nb_invert 反转 */ long_lshift, /*nb_lshift 逻辑左移 */ (binaryfunc)long_rshift, /*nb_rshift 逻辑右移 */ long_and, /*nb_and 与操作 */ long_xor, /*nb_xor 异或 */ long_or, /*nb_or 或操作 */ long_long, /*nb_int*/ 0, /*nb_reserved*/ long_float, /*nb_float*/ 0, /* nb_inplace_add */ 0, /* nb_inplace_subtract */ 0, /* nb_inplace_multiply */ 0, /* nb_inplace_remainder */ 0, /* nb_inplace_power */ 0, /* nb_inplace_lshift */ 0, /* nb_inplace_rshift */ 0, /* nb_inplace_and */ 0, /* nb_inplace_xor */ 0, /* nb_inplace_or */ long_div, /* nb_floor_divide */ long_true_divide, /* nb_true_divide */ 0, /* nb_inplace_floor_divide */ 0, /* nb_inplace_true_divide */ long_long, /* nb_index */ }; 整数相加 源文件:Objects/longobject.c // Objects/longobject.c static PyObject * long_add(PyLongObject *a, PyLongObject *b) { PyLongObject *z; CHECK_BINOP(a, b); if (Py_ABS(Py_SIZE(a)) 可以看到整数的加法运算函数 long_add 根据 a、b 的 ob_size 又细分为两个函数 (x_add 和 x_sub) 做处理 源文件:Objects/longobject.c // Objects/longobject.c /* Add the absolute values of two integers. */ static PyLongObject * x_add(PyLongObject *a, PyLongObject *b) { Py_ssize_t size_a = Py_ABS(Py_SIZE(a)), size_b = Py_ABS(Py_SIZE(b)); PyLongObject *z; Py_ssize_t i; digit carry = 0; /* Ensure a is the larger of the two: */ // 确保 a 大于 b if (size_a ob_digit[i] + b->ob_digit[i]; z->ob_digit[i] = carry & PyLong_MASK; carry >>= PyLong_SHIFT; } for (; i ob_digit[i]; z->ob_digit[i] = carry & PyLong_MASK; carry >>= PyLong_SHIFT; } z->ob_digit[i] = carry; return long_normalize(z); } 加法运算函数 x_add 从 ob_digit 数组的低位开始依次按位相加,carry 做进位处理,然后处理 a 对象的高位数字,最后使用 long_normalize 函数调整 ob_size,确保 ob_digit[abs(ob_size)-1]不为零,这与普通四则运算的加法运算相同,只不过进位单元不同而已 源文件:Objects/longobject.c // Objects/longobject.c /* Subtract the absolute values of two integers. */ static PyLongObject * x_sub(PyLongObject *a, PyLongObject *b) { Py_ssize_t size_a = Py_ABS(Py_SIZE(a)), size_b = Py_ABS(Py_SIZE(b)); PyLongObject *z; Py_ssize_t i; int sign = 1; digit borrow = 0; /* Ensure a is the larger of the two: */ // 确保 a 大于 b if (size_a = 0 && a->ob_digit[i] == b->ob_digit[i]) ; if (i ob_digit[i] ob_digit[i]) { sign = -1; { PyLongObject *temp = a; a = b; b = temp; } } size_a = size_b = i+1; } z = _PyLong_New(size_a); if (z == NULL) return NULL; for (i = 0; i PyLong_SHIFT. */ borrow = a->ob_digit[i] - b->ob_digit[i] - borrow; z->ob_digit[i] = borrow & PyLong_MASK; borrow >>= PyLong_SHIFT; borrow &= 1; /* Keep only one sign bit */ } for (; i ob_digit[i] - borrow; z->ob_digit[i] = borrow & PyLong_MASK; borrow >>= PyLong_SHIFT; borrow &= 1; /* Keep only one sign bit */ } assert(borrow == 0); if (sign 与普通四则运算减法相同,数不够大则向高一位借位, 减法运算函数 x_sub 的示例图如下,注:PyLong_SHIFT 为 30 整数相乘 源文件:Objects/longobject.c // Objects/longobject.c static PyObject * long_mul(PyLongObject *a, PyLongObject *b) { PyLongObject *z; CHECK_BINOP(a, b); /* fast path for single-digit multiplication */ if (Py_ABS(Py_SIZE(a)) k_mul 函数是一种快速乘法 源文件 Karatsuba 的算法主要是用于两个大数的乘法,极大提高了运算效率,相较于普通乘法降低了复杂度,并在其中运用了递归的思想。 基本的原理和做法是将位数很多的两个大数 x 和 y 分成位数较少的数,每个数都是原来 x 和 y 位数的一半。 这样处理之后,简化为做三次乘法,并附带少量的加法操作和移位操作。 具体可以看 wiki Karatsuba 算法的实现 Copyright © FlagGo 2019 all right reserved,powered by Gitbook该文件修订时间: 2020-03-23 19:36:27 "},"objects/list-object/":{"url":"objects/list-object/","title":"Python List 对象","keywords":"","body":"Python List 对象 在Python中的list可以存放任何类型的数据,查看PyListObject可以发现,list实际存放的是PyObject* 指针 PyListObject 源文件:Include/listobject.h // listobject.h typedef struct { PyObject_VAR_HEAD /* Vector of pointers to list elements. list[0] is ob_item[0], etc. */ PyObject **ob_item; /* ob_item contains space for 'allocated' elements. The number * currently in use is ob_size. * Invariants: * 0 示例 lst = [] lst.append(1) 其存储结构如下图 PyListObject对象的一些操作 创建PyListObject PyList_New 对象赋值 PyList_SetItem 获取元素 PyList_GetItem 插入元素 PyList_Insert 追加元素 PyList_Append 移除元素 list_remove 调整list大小 list_resize PyList_New 创建对象 为了避免频繁的申请内存空间,创建PyListObject的时候会先检查缓冲池是否有可用空间 源文件:Objects/listobject.c // listobject.c PyObject * PyList_New(Py_ssize_t size) { PyListObject *op; #ifdef SHOW_ALLOC_COUNT static int initialized = 0; if (!initialized) { Py_AtExit(show_alloc); initialized = 1; } #endif // size 合法性检查 if (size ob_item = NULL; else { op->ob_item = (PyObject **) PyMem_Calloc(size, sizeof(PyObject *)); if (op->ob_item == NULL) { Py_DECREF(op); return PyErr_NoMemory(); } } Py_SIZE(op) = size; op->allocated = size; _PyObject_GC_TRACK(op); return (PyObject *) op; } PyListObject缓冲池默认大小为80 源文件:Include/listobject.c // listobject.c /* Empty list reuse scheme to save calls to malloc and free */ #ifndef PyList_MAXFREELIST #define PyList_MAXFREELIST 80 #endif static PyListObject *free_list[PyList_MAXFREELIST]; static int numfree = 0; PyList_SetItem 元素赋值 源文件:Objects/listobject.c // listobject.c int PyList_SetItem(PyObject *op, Py_ssize_t i, PyObject *newitem) { PyObject **p; if (!PyList_Check(op)) { Py_XDECREF(newitem); PyErr_BadInternalCall(); return -1; } if (i = Py_SIZE(op)) { Py_XDECREF(newitem); PyErr_SetString(PyExc_IndexError, \"list assignment index out of range\"); return -1; } p = ((PyListObject *)op) -> ob_item + i; Py_XSETREF(*p, newitem); return 0; } 元素赋值的示例 lst = [0, 1, 2] lst[0] = 3 # 这里 lst[0] = 3 会调用 PyList_SetItem 函数 PyList_GetItem 获取元素 源文件:Objects/listobject.c // Objects/listobject.c PyObject * PyList_GetItem(PyObject *op, Py_ssize_t i) { if (!PyList_Check(op)) { PyErr_BadInternalCall(); return NULL; } if (i = Py_SIZE(op)) { if (indexerr == NULL) { indexerr = PyUnicode_FromString( \"list index out of range\"); if (indexerr == NULL) return NULL; } PyErr_SetObject(PyExc_IndexError, indexerr); return NULL; } return ((PyListObject *)op) -> ob_item[i]; } 获取元素的示例 lst = [1, 2, 3, 4] print(lst[3]) # lst[3] 实际调用的就是 PyList_GetItem # 根据索引返回对应的元素 PyList_Append 追加元素 PyList_Append 调用 app1 int PyList_Append(PyObject *op, PyObject *newitem) { if (PyList_Check(op) && (newitem != NULL)) return app1((PyListObject *)op, newitem); PyErr_BadInternalCall(); return -1; } 源文件:Objects/listobject.c // Objects/listobject.c static int app1(PyListObject *self, PyObject *v) { Py_ssize_t n = PyList_GET_SIZE(self); assert (v != NULL); if (n == PY_SSIZE_T_MAX) { PyErr_SetString(PyExc_OverflowError, \"cannot add more objects to list\"); return -1; } if (list_resize(self, n+1) 从app1代码可以看出追加元素操作大致流程如下 调用list_resize,将list大小加一 将元素插入list尾部 PyList_Insert 插入元素 PyList_Insert 调用 ins1 int PyList_Insert(PyObject *op, Py_ssize_t where, PyObject *newitem) { if (!PyList_Check(op)) { PyErr_BadInternalCall(); return -1; } return ins1((PyListObject *)op, where, newitem); } 源文件:Objects/listobject.c // Objects/listobject.c static int ins1(PyListObject *self, Py_ssize_t where, PyObject *v) { Py_ssize_t i, n = Py_SIZE(self); PyObject **items; if (v == NULL) { PyErr_BadInternalCall(); return -1; } if (n == PY_SSIZE_T_MAX) { PyErr_SetString(PyExc_OverflowError, \"cannot add more objects to list\"); return -1; } if (list_resize(self, n+1) n) where = n; items = self->ob_item; for (i = n; --i >= where; ) items[i+1] = items[i]; Py_INCREF(v); items[where] = v; return 0; } 从ins1代码可以看出插入元素操作大致流程如下 调用list_resize,将list大小加一 将要插入的位置的元素都往后移一个位置 将元素插入指定位置 list_remove 移除元素 源文件:Objects/listobject.c // listobject.c static PyObject * list_remove(PyListObject *self, PyObject *value) /*[clinic end generated code: output=f087e1951a5e30d1 input=2dc2ba5bb2fb1f82]*/ { Py_ssize_t i; for (i = 0; i ob_item[i], value, Py_EQ); if (cmp > 0) { if (list_ass_slice(self, i, i+1, (PyObject *)NULL) == 0) Py_RETURN_NONE; return NULL; } else if (cmp 移除元素示例 lst = [0, 2, 4, 3] lst.remove(3) \"\"\" lst.remove(3) 会调用 list_remove函数, list_remove函数会遍历列表,使用PyObject_RichCompareBool与目标值进行比较, 相同则调用list_ass_slice进行移除,当遍历完列表还未找到则报错 \"\"\" list_resize 调整list存储空间 随着list元素的增加,list的存储空间可能会不够用,这个时候就需要扩大list的存储空间。 随着list元素的减少,list的存储空间可能存在冗余,这个时候就需要缩小list的存储空间。 函数list_resize就是用于调节list存储空间大小的 源文件:Objects/listobject.c // listobject.c static int list_resize(PyListObject *self, Py_ssize_t newsize) { PyObject **items; size_t new_allocated, num_allocated_bytes; Py_ssize_t allocated = self->allocated; /* Bypass realloc() when a previous overallocation is large enough to accommodate the newsize. If the newsize falls lower than half the allocated size, then proceed with the realloc() to shrink the list. */ if (allocated >= newsize && newsize >= (allocated >> 1)) { assert(self->ob_item != NULL || newsize == 0); Py_SIZE(self) = newsize; return 0; } /* This over-allocates proportional to the list size, making room * for additional growth. The over-allocation is mild, but is * enough to give linear-time amortized behavior over a long * sequence of appends() in the presence of a poorly-performing * system realloc(). * The growth pattern is: 0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ... * Note: new_allocated won't overflow because the largest possible value * is PY_SSIZE_T_MAX * (9 / 8) + 6 which always fits in a size_t. */ new_allocated = (size_t)newsize + (newsize >> 3) + (newsize (size_t)PY_SSIZE_T_MAX / sizeof(PyObject *)) { PyErr_NoMemory(); return -1; } if (newsize == 0) new_allocated = 0; num_allocated_bytes = new_allocated * sizeof(PyObject *); items = (PyObject **)PyMem_Realloc(self->ob_item, num_allocated_bytes); if (items == NULL) { PyErr_NoMemory(); return -1; } self->ob_item = items; Py_SIZE(self) = newsize; self->allocated = new_allocated; return 0; } 当 allocated/2 时,list_resize只会改变 ob_size不会改变allocated。 其他情况则需要调用PyMem_Realloc函数分配新的空间存储列表元素。 列表allocated的增长模式是 0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ... 其公式为 new_allocated = (size_t)newsize + (newsize >> 3) + (newsize Copyright © FlagGo 2019 all right reserved,powered by Gitbook该文件修订时间: 2020-03-23 19:36:27 "},"objects/dict-object/":{"url":"objects/dict-object/","title":"Python Dict 对象","keywords":"","body":"Python 字典 Dictionary object implementation using a hash table ,通过描述可知,python 的字典就是实现了一个 hash 表。 Python 字典概述 在 python 的字典中,一个键值对的对应保存就是 PyDictEntry 类型来保存; 源文件:Include/dict-common.h // Objects/dict-common.h typedef struct { /* Cached hash code of me_key. */ Py_hash_t me_hash; PyObject *me_key; PyObject *me_value; /* This field is only meaningful for combined tables */ } PyDictKeyEntry; 其中,me_hash 就是哈希生成的值,me_key 就是对应的 key 值,me_value 就是对应的值。 在 python 中,在一个 PyDictObject 对象的变化过程中,entry 的状态会在不同的状态间转换。基本上在如下四种状态中转换:Unused、Active、Dummy 和 Pending。 Unused:没有插入任何一个获取的 key 与 value,并且在此之前也没有存储任何的 key,value,每一个 entry 在初始化的时候都会处于这种状态,并且 Unused 会被里面切换到 Active 态,当有 key 插入,这就是 entry 初始化的状态。 Active:当 index>=0 时,me_key 不为空并且 me_value 不为空,保存了一个键值对,Active 可以转变为 Dummy 或者 Pending 状态,当一个键被删除的时候,这只会在 me_value 不为空的时候出现。 Dummy:先前保存了一个 Active 的键值对,但是这个键值对被删除了并且一个活跃的键值对还没有填入该位置,Dummy 可以转变为 Active 当删除的时候,Dummy 的位置不能被重新使用,一旦发生碰撞,探针序列就无法知道这对键值对曾是活跃的键值对。 Pending:索引>=0,键!=空,值=空(仅拆分),尚未插入到拆分表中。 字典的两种类型 python 的字典类型中包含了两种,分离字典(split-table dictionaries)与联合字典(combined-table dictonaries)。详细的信息可查看有关 dict 的描述pep-0412。 split-table dictionaries 当被创建的字典是用来保存 object 的__dict__属性时,该字典才会创建为一个 split-table,它们的键表都被缓存在类型属性中,并且允许所有该类型的实例都可以共享该 keys。当出现一个事件将字典的属性值进行改变的时候,个别字典将慢慢的转化成组合表的形式。这就保证了在大部分的应用场景下很高的内存利用效率,并保证了在各个场景下的正确性。当 split-dict 重新改变大小,它会立马改变为一个 combined-table,如果重置大小作为保存实例属性的结果,并且只有一个该 object 的实例,字典会立马再变为一个 split-table。如果从 split-table 中删除一个 key, value,它不会删除 keys tables 中对应的该值,而只是将 values 数值中移除了该 value。 combined-table dictionaries 直接通过 dict 內建函数与{}生成的字典,模块和大部分其他字典都会创建为 combined-table 字典,一个 combined-table 不会改变为一个 split-table 字典,该字典的行为方式与最初的字典的行为方式大致相同。 容器的相关数据结构 字典对象是通过 PyDictObject 来实现数据的,详情如下; 源文件:Include/dictobject.h // Include/dictobject.h typedef struct _dictkeysobject PyDictKeysObject; /* The ma_values pointer is NULL for a combined table * or points to an array of PyObject* for a split table */ typedef struct { PyObject_HEAD /* Number of items in the dictionary */ Py_ssize_t ma_used;  // 使用的keys个数 /* Dictionary version: globally unique, value change each time the dictionary is modified */ uint64_t ma_version_tag; PyDictKeysObject *ma_keys;     // 如果有则是保存的keys数据 /* If ma_values is NULL, the table is \"combined\": keys and values are stored in ma_keys. If ma_values is not NULL, the table is splitted: keys are stored in ma_keys and values are stored in ma_values */ PyObject **ma_values;  // 如果不为空则保存的是values } PyDictObject; 其中,PyDictKeysObject 的定义如下; 源文件:Include/dict-common.h // Objects/dict-common.h /* See dictobject.c for actual layout of DictKeysObject */ struct _dictkeysobject { Py_ssize_t dk_refcnt;                  // 引用计数 /* Size of the hash table (dk_indices). It must be a power of 2. */ Py_ssize_t dk_size;                   // hash table 的大小必须是2的倍数 /* Function to lookup in the hash table (dk_indices): - lookdict(): general-purpose, and may return DKIX_ERROR if (and only if) a comparison raises an exception. - lookdict_unicode(): specialized to Unicode string keys, comparison of which can never raise an exception; that function can never return DKIX_ERROR. - lookdict_unicode_nodummy(): similar to lookdict_unicode() but further specialized for Unicode string keys that cannot be the value. - lookdict_split(): Version of lookdict() for split tables. */ dict_lookup_func dk_lookup; // 哈希查找函数 /* Number of usable entries in dk_entries. */ Py_ssize_t dk_usable; // 可用的entry数量 /* Number of used entries in dk_entries. */  Py_ssize_t dk_nentries;          // 已经使用的entry数量 /* Actual hash table of dk_size entries. It holds indices in dk_entries, or DKIX_EMPTY(-1) or DKIX_DUMMY(-2). Indices must be: 0 相关数据结构的内存布局为; Python 字典示例 本次示例脚本如下: d = {} d['1']='2' d['1']='e' d.pop('1') 通过 Python 的反汇编工具获取字节码; python -m dis dict_test.py 输出的字节码如下; 2 0 BUILD_MAP 0 2 STORE_NAME 0 (d) 3 4 LOAD_CONST 0 ('2') 6 LOAD_NAME 0 (d) 8 LOAD_CONST 1 ('1') 10 STORE_SUBSCR 4 12 LOAD_CONST 2 ('e') 14 LOAD_NAME 0 (d) 16 LOAD_CONST 1 ('1') 18 STORE_SUBSCR 5 20 LOAD_NAME 0 (d) 22 LOAD_METHOD 1 (pop) 24 LOAD_CONST 1 ('1') 26 CALL_METHOD 1 28 POP_TOP 30 LOAD_CONST 3 (None) 32 RETURN_VALUE 通过字节码指令可知,首先调用了 BUILD_MAP 来创建一个新的字典,接着就对新建的字典 d 进行了赋值操作与更新操作,最后调用了 pop 方法删除一个 key。接下来就详细分析一下相关流程。 字典的初始化流程 通过查找 BUILD_MAP 的虚拟机执行函数; 源文件:Python/ceval.c // Python/ceval.c switch (opcode) { ... TARGET(BUILD_MAP) { Py_ssize_t i; PyObject *map = _PyDict_NewPresized((Py_ssize_t)oparg); // 新建并初始化一个字典 if (map == NULL) goto error;  // 如果新建失败则报错 for (i = oparg; i > 0; i--) {   // 检查在新建的过程中是否通过参数传值 int err; PyObject *key = PEEK(2*i); PyObject *value = PEEK(2*i - 1); err = PyDict_SetItem(map, key, value);      // 找到对应的值并讲该值设置到map中 if (err != 0) {                        // 检查是否报错 Py_DECREF(map); goto error;                        // 如果错误就报错处理 } } while (oparg--) { Py_DECREF(POP());                       // 弹出栈上输入参数的引用 Py_DECREF(POP()); } PUSH(map);                              // 讲生成的map压栈 DISPATCH();                             // 检查是否需要执行下一条字节码指令 } } 从该函数的执行可知,初始化的函数是从_PyDict_NewPresized 开始,该函数就是生成并初始化一个字典; 源文件:Objects/dictobject.c // Objects/dictobject.c PyObject * _PyDict_NewPresized(Py_ssize_t minused) { const Py_ssize_t max_presize = 128 * 1024;  // 字典最大的容量 Py_ssize_t newsize; PyDictKeysObject *new_keys; /* There are no strict guarantee that returned dict can contain minused * items without resize. So we create medium size dict instead of very * large dict or MemoryError. */ if (minused > USABLE_FRACTION(max_presize)) { // 检查传入的数量是否超过最大值 newsize = max_presize; } else { Py_ssize_t minsize = ESTIMATE_SIZE(minused); // 获取最小的值,在新建一个空的字典的时候该值为0 newsize = PyDict_MINSIZE; // 设置字典的最小值 为8 while (newsize 首先,先计算出需要生成的字典的大小,然后再初始化一个 PyDictKeysObject,最后就生成一个 PyDictObject 返回。继续查看 new_keys_object 的执行流程; 源文件:Objects/dictobject.c // Objects/dictobject.c static PyDictKeysObject *new_keys_object(Py_ssize_t size) { PyDictKeysObject *dk; Py_ssize_t es, usable; assert(size >= PyDict_MINSIZE); // 检查size是否大于最小size assert(IS_POWER_OF_2(size)); // 检查是否是2的倍数 usable = USABLE_FRACTION(size); // 检查是否可用  根据经验在1/2和2/3之间效果最好 if (size 4 else if (size 0) {      // 是否有缓存,如果有缓存就选择缓存中的dk dk = keys_free_list[--numfreekeys]; } else { dk = PyObject_MALLOC(sizeof(PyDictKeysObject) + es * size + sizeof(PyDictKeyEntry) * usable); // 没有缓存可使用的字典则申请内存生成一个 if (dk == NULL) { PyErr_NoMemory(); return NULL; } } DK_DEBUG_INCREF dk->dk_refcnt = 1; // 设置引用计数 dk->dk_size = size; // 设置大小 dk->dk_usable = usable; // 设置是否可用 dk->dk_lookup = lookdict_unicode_nodummy; // 设置查找函数 dk->dk_nentries = 0; memset(&dk->dk_indices[0], 0xff, es * size); // 将申请的内存置空 memset(DK_ENTRIES(dk), 0, sizeof(PyDictKeyEntry) * usable); return dk; } 主要就是通过传入的 size,检查是否超过设置的大小,检查是否有缓存的字典数据可用,如果没有则申请内存重新生成一个 dk,最后进行申请到的内存讲内容清空。接着就会进行 new_dict 初始化数据; 源文件:Objects/dictobject.c // Objects/dictobject.c /* Consumes a reference to the keys object */ static PyObject * new_dict(PyDictKeysObject *keys, PyObject **values) { PyDictObject *mp; assert(keys != NULL); if (numfree) {                            // 判断缓冲池是否有 mp = free_list[--numfree]; assert (mp != NULL); assert (Py_TYPE(mp) == &PyDict_Type);  _Py_NewReference((PyObject *)mp);              // 使用缓冲池对象     } else { mp = PyObject_GC_New(PyDictObject, &PyDict_Type);    // 缓冲池没有则申请新的对象并初始化 if (mp == NULL) { DK_DECREF(keys); free_values(values); return NULL; } } mp->ma_keys = keys; mp->ma_values = values; mp->ma_used = 0;                           // 设置ma_used为0 mp->ma_version_tag = DICT_NEXT_VERSION(); assert(_PyDict_CheckConsistency(mp)); return (PyObject *)mp; } new_dict 就是根据 keys,values 设置到从缓冲池或者新生成一个 dict 对象,最后返回。至此,dict 的创建工作已经完成。 字典的插入与查找 通过字节码的指令 STORE_SUBSCR 可知,该命令就是讲'1'作为 key, '2'作为 value 插入到 d 中,此时查看该执行函数; 源文件:Python/ceval.c // Python/ceval.c switch (opcode) { ... TARGET(STORE_SUBSCR) { PyObject *sub = TOP(); // 第一个值为key PyObject *container = SECOND(); // 该为字典对象 PyObject *v = THIRD(); // 该为value int err; STACKADJ(-3); /* container[sub] = v */ err = PyObject_SetItem(container, sub, v); // 调用该方法设置值 Py_DECREF(v); Py_DECREF(container); Py_DECREF(sub); if (err != 0) goto error; DISPATCH(); } } 此时,从栈中取出相关参数,并将这些值传入 PyObject_SetItem 函数进行处理设置值; 源文件:Objects/abstract.c // Objects/abstract.c int PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value) { PyMappingMethods *m; if (o == NULL || key == NULL || value == NULL) {           // 检查是否为空如果任一为空则报错 null_error(); return -1; } m = o->ob_type->tp_as_mapping;                      // 获取类型的tp_as_mapping方法集      if (m && m->mp_ass_subscript)                       // 如果有设置该类型 return m->mp_ass_subscript(o, key, value); // 调用该mp_ass_subscript方法 if (o->ob_type->tp_as_sequence) { // 获取作为队列的操作集 if (PyIndex_Check(key)) {                       // 检查key是否是索引 Py_ssize_t key_value; key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);  if (key_value == -1 && PyErr_Occurred()) return -1; return PySequence_SetItem(o, key_value, value);       // 调用索引插入 } else if (o->ob_type->tp_as_sequence->sq_ass_item) { type_error(\"sequence index must be \" \"integer, not '%.200s'\", key); return -1; } } type_error(\"'%.200s' object does not support item assignment\", o);   // 则该类型对象不支持设置 return -1; } 其中就调用了字典的 tp_as_mapping 的方法集,并调用了该方法集的 mp_ass_subscript 方法;此时我们分析一下,dict 的 tp_as_mapping 的方法集。此时就调用了 tp_as_mapping 的 mp_ass_subscript 方法,此时就是调用 dict 的 dict_ass_sub 方法; 源文件:Objects/dictobject.c // Objects/dictobject.c static int dict_ass_sub(PyDictObject *mp, PyObject *v, PyObject *w) { if (w == NULL) return PyDict_DelItem((PyObject *)mp, v); else return PyDict_SetItem((PyObject *)mp, v, w); } 可知,删除一个 key 就是 PyDict_DelItem,设置一个 key 就是 PyDict_SetItem; 源文件:Objects/dictobject.c // Objects/dictobject.c int PyDict_SetItem(PyObject *op, PyObject *key, PyObject *value) { PyDictObject *mp; Py_hash_t hash; if (!PyDict_Check(op)) {            // 检查是否是字典类型 PyErr_BadInternalCall(); return -1; } assert(key); assert(value); mp = (PyDictObject *)op; if (!PyUnicode_CheckExact(key) || (hash = ((PyASCIIObject *) key)->hash) == -1)  // 检查传入的key是否hash为-1 { hash = PyObject_Hash(key); // 生成hash调用key对应的tp_hash方法,在本例中传入的是str类型,则调用str类型的tp_hash方法 if (hash == -1) return -1; } /* insertdict() handles any resizing that might be necessary */ return insertdict(mp, key, hash, value); // 生成hash调用key对应的tp_hash方法 } insertdict 方法就是将生成的方法,插入到字典中去; 源文件:Objects/dictobject.c // Objects/dictobject.c static int insertdict(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject *value) { PyObject *old_value; PyDictKeyEntry *ep; Py_INCREF(key); Py_INCREF(value); if (mp->ma_values != NULL && !PyUnicode_CheckExact(key)) { if (insertion_resize(mp) ma_keys->dk_lookup(mp, key, hash, &old_value);     // 调用查找方法 if (ix == DKIX_ERROR) goto Fail; assert(PyUnicode_CheckExact(key) || mp->ma_keys->dk_lookup == lookdict); MAINTAIN_TRACKING(mp, key, value); // 检查mp key values是否需要加入垃圾回收 /* When insertion order is different from shared key, we can't share * the key anymore. Convert this instance to combine table. */ if (_PyDict_HasSplitTable(mp) && ((ix >= 0 && old_value == NULL && mp->ma_used != ix) || (ix == DKIX_EMPTY && mp->ma_used != mp->ma_keys->dk_nentries))) {  // 检查是否是分离表,如果没查找到旧值并且 if (insertion_resize(mp) ma_keys->dk_usable ma_keys, hash);         // 查找一个可用的hash位置 ep = &DK_ENTRIES(mp->ma_keys)[mp->ma_keys->dk_nentries];         // 获取存取的地址 dk_set_index(mp->ma_keys, hashpos, mp->ma_keys->dk_nentries);      // 设置该值 ep->me_key = key;                                 // 保存key ep->me_hash = hash; // 保存计算得出的hash值 if (mp->ma_values) {                               // 如果mp的ma_values有值 assert (mp->ma_values[mp->ma_keys->dk_nentries] == NULL); mp->ma_values[mp->ma_keys->dk_nentries] = value;           // 设置该key对应的value } else { ep->me_value = value; // 直接讲value设置到entry上面 } mp->ma_used++;                                   // 使用个数加1 mp->ma_version_tag = DICT_NEXT_VERSION();   mp->ma_keys->dk_usable--;                            // 可用减1 mp->ma_keys->dk_nentries++; assert(mp->ma_keys->dk_usable >= 0); assert(_PyDict_CheckConsistency(mp)); return 0; } if (_PyDict_HasSplitTable(mp)) { // 如果是分离的 mp->ma_values[ix] = value; // 直接设置ma_values对应的ix到values中 if (old_value == NULL) { /* pending state */ assert(ix == mp->ma_used); mp->ma_used++;                               // 使用加1 } } else { assert(old_value != NULL); DK_ENTRIES(mp->ma_keys)[ix].me_value = value; } mp->ma_version_tag = DICT_NEXT_VERSION(); Py_XDECREF(old_value); /* which **CAN** re-enter (see issue #22653) */ assert(_PyDict_CheckConsistency(mp)); Py_DECREF(key); return 0; Fail: Py_DECREF(value); Py_DECREF(key); return -1; } 首先会调用相关的查找方法,去查找待搜索的值是否已经存在字典中,如果当前字典数据已经满了则会按照增长大小的函数生成一个新的字典,并把旧数据设置到新的字典中,当找到的字典匹配时则返回。 其中 dk_lookup 对应的方法,在初始化之后对应的是 lookdict_unicode_nodummy; 源文件:Objects/dictobject.c // Objects/dictobject.c /* Faster version of lookdict_unicode when it is known that no keys * will be present. */ static Py_ssize_t _Py_HOT_FUNCTION lookdict_unicode_nodummy(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject **value_addr) { assert(mp->ma_values == NULL); /* Make sure this function doesn't have to handle non-unicode keys, including subclasses of str; e.g., one reason to subclass unicodes is to override __eq__, and for speed we don't cater to that here. */ if (!PyUnicode_CheckExact(key)) {                     // 检查如果不是unicode则直接调用lookdict方法查找 mp->ma_keys->dk_lookup = lookdict; return lookdict(mp, key, hash, value_addr); } PyDictKeyEntry *ep0 = DK_ENTRIES(mp->ma_keys);             // 获取keys的首个元素地址 size_t mask = DK_MASK(mp->ma_keys);                    // 获取大小 size_t perturb = (size_t)hash; size_t i = (size_t)hash & mask;                       // 获取生成的最终的值                  for (;;) { Py_ssize_t ix = dk_get_index(mp->ma_keys, i); // 便利ma_keys key列表 assert (ix != DKIX_DUMMY);                     // 判断不能为空 if (ix == DKIX_EMPTY) { // 如果为空则证明找到一个可以使用的 *value_addr = NULL;                       // 讲key对应的value设置为空 return DKIX_EMPTY;                        // 返回 } PyDictKeyEntry *ep = &ep0[ix];             // 获取该位置元素值 assert(ep->me_key != NULL); assert(PyUnicode_CheckExact(ep->me_key)); if (ep->me_key == key || (ep->me_hash == hash && unicode_eq(ep->me_key, key))) {  // 如果key相同 hash值也相同 *value_addr = ep->me_value;                    // 将该值赋值 return ix; } perturb >>= PERTURB_SHIFT;                      // 偏移 i = mask & (i*5 + perturb + 1);                   // 获取下一个位置 } Py_UNREACHABLE(); } 该函数的主要工作就是查找,字典中是否有空余的值,或者如果找到了满足 hash 值与 key 相同的就将 value 设置为找到的值(这也是字典查找的核心逻辑)。至此,字典的插入的大致流程已经分析完毕。 Python 字典的操作测试 现在我们动手观看一下具体的操作实例,首先声明,该例子仅供调试使用,目前调试的字典的 key 与 value 都是 float 类型并且不能 del 或者 pop 其中的 key。操作字典如下所示; d = {20000:2} d[1] = 2 d[3] = 2 首先,讲如下代码插入到 dictobject.c 的 1060 行; // 测试代码 PyObject* key1 = PyLong_FromLong(20000); Py_hash_t hash1 = PyObject_Hash(key1); PyObject* old_value1; Py_ssize_t ix1 = mp->ma_keys->dk_lookup(mp, key1, hash1, &old_value1); if (ix1 == 0){ PyLongObject* give; give = (PyLongObject* )key1; printf(\"found value : %ld\\n\", give->ob_digit[0]); PyDictKeyEntry *ep01 = DK_ENTRIES(mp->ma_keys); int i, count; count = mp->ma_used; int size_count, j; size_count = mp->ma_keys->dk_size; printf(\"%s \", mp->ma_keys->dk_indices); int8_t *indices = (int8_t*)(mp->ma_keys->dk_indices); printf(\"indices index values :\"); for (j=0; jme_key; printf(\"size : %d \", mp->ma_keys->dk_size); printf(\"found value while  key : %ld \", give->ob_digit[0]); give = (PyLongObject* )ep01->me_value; printf(\"value : %ld\\n\", give->ob_digit[0]); ep01++; } } 然后编译运行; Python 3.7.3 (default, May 22 2019, 16:17:57) [GCC 7.3.0] on linux Type \"help\", \"copyright\", \"credits\" or \"license\" for more information. >>> d = {20000:2} found value : 20000 indices index values :0 -1 -1 -1 -1 -1 -1 -1 size : 8 found value while  key : 20000 value : 2 其中为什么初始化的时候输入 20000,是根据代码找到相关的 key 值,因为字典也被 python 自身实现的结构中引用了多次,所以我们就设置了一个特殊值来跟踪我们想要的字典;当 d 初始化的时候,就输出如上所示内容;我们接下来继续操作; >>> d = {20000:2} found value : 20000 indices index values :0 -1 -1 -1 -1 -1 -1 -1 size : 8 found value while  key : 20000 value : 2 >>> d[2] = 3 found value : 20000 indices index values :0 -1 1 -1 -1 -1 -1 -1 size : 8 found value while  key : 20000 value : 2 size : 8 found value while  key : 2 value : 3 >>> d[3] = 4 found value : 20000 indices index values :0 -1 1 2 -1 -1 -1 -1 size : 8 found value while  key : 20000 value : 2 size : 8 found value while  key : 2 value : 3 size : 8 found value while  key : 3 value : 4 >>> d[5] = 6 found value : 20000 indices index values :0 -1 1 2 -1 3 -1 -1 size : 8 found value while  key : 20000 value : 2 size : 8 found value while  key : 2 value : 3 size : 8 found value while  key : 3 value : 4 size : 8 found value while  key : 5 value : 6 >>> d[7] = 8 found value : 20000 indices index values :0 -1 1 2 -1 3 -1 4 size : 8 found value while  key : 20000 value : 2 size : 8 found value while  key : 2 value : 3 size : 8 found value while  key : 3 value : 4 size : 8 found value while  key : 5 value : 6 size : 8 found value while  key : 7 value : 8 此后我们一直添加值进 d,从输出信息可知,index 就是记录了 PyDictKeyEntry 的索引值,-1 就表示该处未使用。 当我们继续向 d 中添加内容时; >>> d[9] = 10 found value : 20000 indices index values :0 -1 1 2 -1 3 -1 4 -1 5 -1 -1 -1 -1 -1 -1 size : 16 found value while  key : 20000 value : 2 size : 16 found value while  key : 2 value : 3 size : 16 found value while  key : 3 value : 4 size : 16 found value while  key : 5 value : 6 size : 16 found value while  key : 7 value : 8 size : 16 found value while  key : 9 value : 10 >>> d[10] = 11 found value : 20000 indices index values :0 -1 1 2 -1 3 -1 4 -1 5 6 -1 -1 -1 -1 -1 size : 16 found value while  key : 20000 value : 2 size : 16 found value while  key : 2 value : 3 size : 16 found value while  key : 3 value : 4 size : 16 found value while  key : 5 value : 6 size : 16 found value while  key : 7 value : 8 size : 16 found value while  key : 9 value : 10 size : 16 found value while  key : 10 value : 11 从输出内容可知,字典的大小随之改变了,这也说明了 python 字典的最佳大小容量限定在 1/2 到 2/3 之间,如果超过这个阈值则字典就会自动扩容,扩容的策略大家可详细查看源码。 Copyright © FlagGo 2019 all right reserved,powered by Gitbook该文件修订时间: 2020-03-23 19:36:27 "},"objects/set-object/":{"url":"objects/set-object/","title":"Python Set 对象","keywords":"","body":"python 集合 set 是无序且不重复的集合,是可变的,通常用来从列表中删除重复项以及计算数学运算,如交集、并集、差分和对称差分等集合操作。set 支持 x in set, len(set),和 for x in set。作为一个无序的集合,set 不记录元素位置或者插入点。因此,sets 不支持 indexing, 或其它类序列的操作。 python 集合概述 在 set 中,对应的 set 的值的存储是通过结构 setentry 来保存数据值的; 源文件:include/setobject.h typedef struct { PyObject *key; Py_hash_t hash; /* Cached hash code of the key */ } setentry; key 就是保存的数据,hash 就是保存的数据的 hash,便于查找,set 也是基于 hash 表来实现。对应的 setentry 所对应的 set 的数据结构如下; 源文件:include/setobject.h typedef struct { PyObject_HEAD Py_ssize_t fill; /* Number active and dummy entries*/ // 包括已经使用的entry与空entry值的总和 Py_ssize_t used; /* Number active entries */ // 已经使用可用的总量 /* The table contains mask + 1 slots, and that's a power of 2. * We store the mask instead of the size because the mask is more * frequently needed. */ Py_ssize_t mask;                                // 与hash求和的mask /* The table points to a fixed-size smalltable for small tables * or to additional malloc'ed memory for bigger tables. * The table pointer is never NULL which saves us from repeated * runtime null-tests. */ setentry *table; // 保存数据的数组数组指针 Py_hash_t hash; /* Only used by frozenset objects */ Py_ssize_t finger; /* Search finger for pop() */ setentry smalltable[PySet_MINSIZE]; // 保存数据的数组 默认初始化为8个元素,通过table指向 PyObject *weakreflist; /* List of weak references */ } PySetObject; 一个 set 就对应一个 PySetObject 类型数据,set 会根据保存的元素自动调整大小。相关的内存布局如下; python 集合(set)示例 示例脚本如下: set_a = {1,2}  set_a.add(3) set_a.add(4) set_a.remove(1) set_a.update({3,}) set_a.union({1,5}) 通过 python 反汇编获取该脚本的字节码; python -m dis set_test.py 输出的字节码如下所示; 1 0 LOAD_CONST 0 (1) 3 LOAD_CONST 1 (2) 6 BUILD_SET 2 9 STORE_NAME 0 (set_a) 2 12 LOAD_NAME 0 (set_a) 15 LOAD_ATTR 1 (add) 18 LOAD_CONST 2 (3) 21 CALL_FUNCTION 1 24 POP_TOP 3 25 LOAD_NAME 0 (set_a) 28 LOAD_ATTR 1 (add) 31 LOAD_CONST 3 (4) 34 CALL_FUNCTION 1 37 POP_TOP 4 38 LOAD_NAME 0 (set_a) 41 LOAD_ATTR 2 (remove) 44 LOAD_CONST 0 (1) 47 CALL_FUNCTION 1 50 POP_TOP 5 51 LOAD_NAME 0 (set_a) 54 LOAD_ATTR 3 (update) 57 LOAD_CONST 2 (3) 60 BUILD_SET 1 63 CALL_FUNCTION 1 66 POP_TOP 6 67 LOAD_NAME 0 (set_a) 70 LOAD_ATTR 4 (union) 73 LOAD_CONST 0 (1) 76 LOAD_CONST 4 (5) 79 BUILD_SET 2 82 CALL_FUNCTION 1 85 POP_TOP 86 LOAD_CONST 5 (None) 89 RETURN_VALUE 通过该字节码指令可知,创建 set 调用了 BUILD_SET 指令,初始化完成之后,就调用 set 的 add 方法添加元素,调用 remove 删除元素,调用 update 来更新集合,通过 union 来合并集合。接下来就详细分析一下相关的操作流程。 set 的创建与初始化 查找 BUILD_SET 的虚拟机执行函数如下; 源文件:Python/ceval.c // Python/ceval.c TARGET(BUILD_SET) { PyObject *set = PySet_New(NULL); // 新建并初始化一个set int err = 0; int i; if (set == NULL) goto error; for (i = oparg; i > 0; i--) { // 将传入初始化的参数传入 PyObject *item = PEEK(i); if (err == 0) err = PySet_Add(set, item); // 并依次对set进行添加操作 Py_DECREF(item); } STACKADJ(-oparg);                // 移动弹栈 if (err != 0) { Py_DECREF(set); goto error; } PUSH(set);                     // 讲set压栈 DISPATCH();                    // 执行下一条指令 } 此时继续查看 PySet_New 函数的执行流程; 源文件:Objects/setobject.c PyObject * PySet_New(PyObject *iterable) { return make_new_set(&PySet_Type, iterable); } ... static PyObject * make_new_set(PyTypeObject *type, PyObject *iterable) { PySetObject *so; so = (PySetObject *)type->tp_alloc(type, 0); // 申请该元素的内存 if (so == NULL) // 内存申请失败则返回为空 return NULL; so->fill = 0; // 初始化的时候都为0 so->used = 0; so->mask = PySet_MINSIZE - 1; // PySet_MINSIZE默认我8,mask为7 so->table = so->smalltable; // 将保存数据的头指针指向table so->hash = -1; // 设置hash值为-1 so->finger = 0; so->weakreflist = NULL; if (iterable != NULL) { // 如果有迭代器 if (set_update_internal(so, iterable)) { // 将内容更新到so中 Py_DECREF(so); return NULL; } } return (PyObject *)so; // 返回初始化完成的set } 从 PySet_New 的执行流程可知,字典的初始化过程就是初始化相关数据结构。 set 的插入 在本例的初始化过程中,由于传入了初始值 1,2,所以会在执行字节码指令的时候,执行 PySet_Add,该函数的本质与 set_a.add(3)本质都调用了更底层 set_add_key 函数; 源文件:Objects/setobject.c int PySet_Add(PyObject *anyset, PyObject *key) { if (!PySet_Check(anyset) && (!PyFrozenSet_Check(anyset) || Py_REFCNT(anyset) != 1)) { PyErr_BadInternalCall(); return -1; } return set_add_key((PySetObject *)anyset, key); // 向字典中添加key; } 继续查看 set_add_key 函数的执行过程; 源文件:Objects/setobject.c static int set_add_key(PySetObject *so, PyObject *key) { Py_hash_t hash; if (!PyUnicode_CheckExact(key) || (hash = ((PyASCIIObject *) key)->hash) == -1) { hash = PyObject_Hash(key); // 获取传入值的hash值 if (hash == -1) // 如果不能hash则返回-1 return -1; } return set_add_entry(so, key, hash); // 计算完成后添加值 } 该函数主要就是检查传入的 key 是否能够被 hash,如果能够被 hash 则直接返回,如果能被 hash 则继续调用 set_add_entry 函数将值加入到 set 中; 源文件:Objects/setobject.c static int set_add_entry(PySetObject *so, PyObject *key, Py_hash_t hash) { setentry *table; setentry *freeslot; setentry *entry; size_t perturb; size_t mask; size_t i; /* Unsigned for defined overflow behavior */ size_t j; int cmp; /* Pre-increment is necessary to prevent arbitrary code in the rich comparison from deallocating the key just before the insertion. */ Py_INCREF(key); // 提高key的引用计数 restart: mask = so->mask;  // 获取so->mask i = (size_t)hash & mask;  // 通过传入的hash与mask求索引下标 entry = &so->table[i];    // 获取索引对应的值 if (entry->key == NULL) // 如果获取索引的值没有被使用则直接跳转到found_unused处执行 goto found_unused; freeslot = NULL; perturb = hash;    // perturb设置为当前hash值   while (1) { if (entry->hash == hash) { // 如果当前hash值相等 PyObject *startkey = entry->key;                      // 获取当前key /* startkey cannot be a dummy because the dummy hash field is -1 */ assert(startkey != dummy); // 检查key是否为dummy if (startkey == key) // 如果找到的值与传入需要设置的值相同则跳转到found_active处执行 goto found_active; if (PyUnicode_CheckExact(startkey) && PyUnicode_CheckExact(key) && _PyUnicode_EQ(startkey, key)) // 如果是unicode,通过类型转换检查两个key的内容是否相同,如果不相同则跳转到found_active处 goto found_active; table = so->table; // 如果没有找到,则获取当前table的头部节点 Py_INCREF(startkey); cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);          // 如果是其他类型的对象则调用比较方法去比较两个key是否相同 Py_DECREF(startkey); if (cmp > 0) /* likely */ // 如果找到则跳转到found_active goto found_active; if (cmp table || entry->key != startkey) // 如果set改变了则重新开始查找 goto restart; mask = so->mask; /* help avoid a register spill */    } else if (entry->hash == -1) freeslot = entry;    // 如果不能hash 则设置freeslot if (i + LINEAR_PROBES hash == 0 && entry->key == NULL)              // 如果找到当前hash为空或者key为空的则跳转到found_unused_or_dummy处执行 goto found_unused_or_dummy; if (entry->hash == hash) {   // 如果找到的hash值相同 PyObject *startkey = entry->key; // 获取该值 assert(startkey != dummy); // 检查是否为dummy if (startkey == key) // 如果key相同则跳转到found_active处执行 goto found_active; if (PyUnicode_CheckExact(startkey) && PyUnicode_CheckExact(key) && _PyUnicode_EQ(startkey, key)) // 检查是否为unicode,并比较如果不相同则跳转到found_active goto found_active; table = so->table; // 调用key本身的方法比较 Py_INCREF(startkey); cmp = PyObject_RichCompareBool(startkey, key, Py_EQ); Py_DECREF(startkey); if (cmp > 0) goto found_active; if (cmp table || entry->key != startkey) goto restart; mask = so->mask; } else if (entry->hash == -1) freeslot = entry; } } perturb >>= PERTURB_SHIFT; // 如果没有找到则获取下一个索引值 i = (i * 5 + 1 + perturb) & mask; // 右移5位 加上 索引值*5 加1与mask求余获取下一个索引值 entry = &so->table[i]; // 获取下一个元素 if (entry->key == NULL)               // 如果找到为空则直接跳转到found_unused_or_dummy处 goto found_unused_or_dummy; } found_unused_or_dummy: if (freeslot == NULL)                                  // 检查freeslot是否为空如果为空则跳转到found_unused处执行即找到了dummy位置 goto found_unused; so->used++;                       // 使用数加1 freeslot->key = key;                                   // 设置key与hash值 freeslot->hash = hash; return 0; found_unused: so->fill++;                                        // 使用总数加1 so->used++;                                        // 使用总数加1  entry->key = key;                                     // 设置key与hash值 entry->hash = hash; if ((size_t)so->fill*5 used>50000 ? so->used*2 : so->used*4);    // 如果已使用的总数大于3/5则重新调整table,如果set使用的总数超过了50000则扩展为以前的2倍否则就是四倍 found_active: Py_DECREF(key);                                      // 如果找到了该值 则什么也不做 return 0; comparison_error: Py_DECREF(key);                                      // 如果比较失败则返回-1 return -1; } 此时基本的流程就是通过传入的 hash 值,如果计算出的索引值,没有值,则直接将该值存入对应的 entry 中,如果相同则不插入,如果索引对应的值且值不同,则遍历从该索引往后9个位置的值,依次找到有空余位置的值,并将该值设置进去。如果设置该值之后使用的数量占总的申请数量超过了 3/5 则重新扩充 set,扩充的原则就是如果当前的 set->used>50000 就进行两倍扩充否则就进行四倍扩充。 插入的概述如下,默认 s 初始化为空; s.add(1) // index = 1 & 7 = 1 s.add(2) // index = 2 & 7 = 2 s.add(7) // index = 9 & 7 = 1 大致的 set 的插入过程执行完毕。 set 的删除 set 的删除操作主要集中在 set_remove()函数上,如下示例; 源文件:Objects/setobject.c static PyObject * set_remove(PySetObject *so, PyObject *key) { PyObject *tmpkey; int rv; rv = set_discard_key(so, key); // 将该key设置为dummy if (rv 此时就会调用 set_discard_key 方法来讲对应的 entry 设置为 dummy;set_discard_key 方法如下; 源文件:Objects/setobject.c static int set_discard_key(PySetObject *so, PyObject *key) { Py_hash_t hash; if (!PyUnicode_CheckExact(key) || (hash = ((PyASCIIObject *) key)->hash) == -1) { hash = PyObject_Hash(key);  // 检查是否可用hash如果可用则调用set_discard_entry方法 if (hash == -1) return -1; } return set_discard_entry(so, key, hash); } 该函数主要就是做了检查 key 是否可用 hash 的检查,此时如果可用 hash 则调用 set_discard_entry 方法; 源文件:Objects/setobject.c static int set_discard_entry(PySetObject *so, PyObject *key, Py_hash_t hash) { setentry *entry; PyObject *old_key; entry = set_lookkey(so, key, hash);      // 查找该值 set_lookkey该方法与插入的逻辑类似大家可自行查看 if (entry == NULL)                 // 如果没有找到则返回-1 return -1; if (entry->key == NULL) return DISCARD_NOTFOUND;           // 找到entry而key为空则返回notfound old_key = entry->key; // 找到正常值则讲该值对应的entry设置为dummy entry->key = dummy; entry->hash = -1; // hash值为-1 so->used--; // 使用数量减1 但是fill数量未变 Py_DECREF(old_key);                 // 减少该对象引用 return DISCARD_FOUND;                // 返回返现 } 此时就是查找该值,如果找到该值并将该值设置为 dummy,并且将 used 值减1,此处没有减去 fill 的数量,从此处可知,fill 包括所有曾经申请过的数量。 set 的 resize set 的 resize 主要依靠 set_table_reseize 函数来实现; 源文件:Objects/setobject.c static int set_table_resize(PySetObject *so, Py_ssize_t minused) { setentry *oldtable, *newtable, *entry; Py_ssize_t oldmask = so->mask; // 设置旧的mask size_t newmask; int is_oldtable_malloced; setentry small_copy[PySet_MINSIZE]; // 最小的拷贝数组 assert(minused >= 0); /* Find the smallest table size > minused. */ /* XXX speed-up with intrinsics */ size_t newsize = PySet_MINSIZE; while (newsize table;                   // 先获取旧的table assert(oldtable != NULL); is_oldtable_malloced = oldtable != so->smalltable; if (newsize == PySet_MINSIZE) {                  // 如果获取的新大小与PySet_MINSIZE的大小相同 /* A large table is shrinking, or we can't get any smaller. */ newtable = so->smalltable;                  // 获取新table的地址 if (newtable == oldtable) {                 // 如果相同 if (so->fill == so->used) {              // 如果使用的相同则什么都不做 /* No dummies, so no point doing anything. */ return 0; } /* We're not going to resize it, but rebuild the table anyway to purge old dummy entries. Subtle: This is *necessary* if fill==size, as set_lookkey needs at least one virgin slot to terminate failing searches. If fill fill > so->used); memcpy(small_copy, oldtable, sizeof(small_copy)); // 将数据拷贝到set_lookkey中 oldtable = small_copy;                   } } else { newtable = PyMem_NEW(setentry, newsize); // 新申请内存 if (newtable == NULL) {                     // 如果为空则申请内存失败报错 PyErr_NoMemory(); return -1; } } /* Make the set empty, using the new table. */ assert(newtable != oldtable); // 检查新申请的与就table不同 memset(newtable, 0, sizeof(setentry) * newsize);        // 新申请的内存置空 so->mask = newsize - 1; // 设置新的size so->table = newtable; // 重置table指向新table /* Copy the data over; this is refcount-neutral for active entries; dummy entries aren't copied over, of course */ newmask = (size_t)so->mask; // 获取新的mask if (so->fill == so->used) { // 如果使用的与曾经使用的数量相同 for (entry = oldtable; entry key != NULL) { set_insert_clean(newtable, newmask, entry->key, entry->hash);  // 如果值不为空则插入到新的table中 } } } else { so->fill = so->used;                        // 如果不相同则重置fill为used的值 for (entry = oldtable; entry key != NULL && entry->key != dummy) {     // 检查如果不为dummy并且key不为空的情况下 set_insert_clean(newtable, newmask, entry->key, entry->hash);  // 重新插入该列表该值 } } } if (is_oldtable_malloced)                       // 如果两个表相同则删除旧table PyMem_DEL(oldtable); return 0; // 返回0 } 主要是检查是否 table 相同并且需要重新 resize 的值,然后判断是否 fill 与 used 相同,如果相同则全部插入,如果不同,则遍历旧 table 讲不为空并且不为 dummy 的值插入到新表中; 源文件:Objects/setobject.c static void set_insert_clean(setentry *table, size_t mask, PyObject *key, Py_hash_t hash) { setentry *entry; size_t perturb = hash; size_t i = (size_t)hash & mask;         // 计算索引 size_t j; while (1) { entry = &table[i]; // 获取当前entry if (entry->key == NULL) // 如果为空则跳转值found_null设置key与hash goto found_null; if (i + LINEAR_PROBES key == NULL) // 如果为空则跳转到found_null goto found_null; } } perturb >>= PERTURB_SHIFT; // 计算下一个索引值继续寻找 i = (i * 5 + 1 + perturb) & mask; } found_null: entry->key = key; entry->hash = hash; } set 的 resize 的操作基本如上所述。 Copyright © FlagGo 2019 all right reserved,powered by Gitbook该文件修订时间: 2020-03-23 19:36:27 "},"objects/simple-interpreter/":{"url":"objects/simple-interpreter/","title":"实现简版 Python","keywords":"","body":"Python 字符串 对象 Copyright © FlagGo 2019 all right reserved,powered by Gitbook该文件修订时间: 2020-03-23 19:36:27 "}} \ No newline at end of file