Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 9905883

Browse filesBrowse files
committed
🎉 学习第6章对象引用、可变性和垃圾回收
1 parent 6f455ef commit 9905883
Copy full SHA for 9905883

File tree

Expand file treeCollapse file tree

2 files changed

+273
-0
lines changed
Filter options
Expand file treeCollapse file tree

2 files changed

+273
-0
lines changed

‎notes/ch06.ipynb

Copy file name to clipboard
+273Lines changed: 273 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,273 @@
1+
{
2+
"cells": [
3+
{
4+
"cell_type": "markdown",
5+
"id": "65065ec2",
6+
"metadata": {},
7+
"source": [
8+
"# 第6章 对象引用、可变性和垃圾回收"
9+
]
10+
},
11+
{
12+
"cell_type": "markdown",
13+
"id": "5b56a0e0",
14+
"metadata": {},
15+
"source": [
16+
"## 6.1 浅拷贝"
17+
]
18+
},
19+
{
20+
"cell_type": "markdown",
21+
"id": "5bd3b687",
22+
"metadata": {},
23+
"source": [
24+
"浅拷贝的方式:\n",
25+
"\n",
26+
"- 复制列表使用内置的类型构造函数。\n",
27+
"- 使用`[:]`进行浅拷贝。\n",
28+
"- 使用`copy.copy`函数进行浅拷贝。"
29+
]
30+
},
31+
{
32+
"cell_type": "code",
33+
"execution_count": 1,
34+
"id": "28724977",
35+
"metadata": {},
36+
"outputs": [
37+
{
38+
"name": "stdout",
39+
"output_type": "stream",
40+
"text": [
41+
"l1: [3, [66, 44], (7, 8, 9), 100]\n",
42+
"l2: [3, [66, 44], (7, 8, 9)]\n",
43+
"l1: [3, [66, 44, 33, 22], (7, 8, 9), 100]\n",
44+
"l2: [3, [66, 44, 33, 22], (7, 8, 9, 10, 11)]\n"
45+
]
46+
}
47+
],
48+
"source": [
49+
"l1 = [3, [66, 55, 44], (7, 8, 9)]\n",
50+
"l2 = list(l1)\n",
51+
"l1.append(100)\n",
52+
"l1[1].remove(55)\n",
53+
"print('l1:', l1)\n",
54+
"print('l2:', l2)\n",
55+
"l2[1] += [33, 22]\n",
56+
"l2[2] += (10, 11)\n",
57+
"print('l1:', l1)\n",
58+
"print('l2:', l2)"
59+
]
60+
},
61+
{
62+
"cell_type": "markdown",
63+
"id": "ebfc3e0f",
64+
"metadata": {},
65+
"source": [
66+
"![浅拷贝可视化](./images/06-01-python-vis.png)"
67+
]
68+
},
69+
{
70+
"cell_type": "markdown",
71+
"id": "3aa648d4",
72+
"metadata": {},
73+
"source": [
74+
"深拷贝方式:使用`copy.deepcopy`函数"
75+
]
76+
},
77+
{
78+
"cell_type": "code",
79+
"execution_count": 2,
80+
"id": "ab619f2d",
81+
"metadata": {},
82+
"outputs": [],
83+
"source": [
84+
"# 校车乘客在途中有上有下\n",
85+
"class Bus:\n",
86+
" def __init__(self, passengers=None):\n",
87+
" if passengers is None:\n",
88+
" self.passengers = []\n",
89+
" else:\n",
90+
" self.passengers = list(passengers)\n",
91+
"\n",
92+
" def pick(self, name):\n",
93+
" self.passengers.append(name)\n",
94+
"\n",
95+
" def drop(self, name):\n",
96+
" self.passengers.remove(name)"
97+
]
98+
},
99+
{
100+
"cell_type": "code",
101+
"execution_count": 6,
102+
"id": "64c4950f",
103+
"metadata": {},
104+
"outputs": [
105+
{
106+
"data": {
107+
"text/plain": [
108+
"['Alice', 'Claire', 'David']"
109+
]
110+
},
111+
"execution_count": 6,
112+
"metadata": {},
113+
"output_type": "execute_result"
114+
}
115+
],
116+
"source": [
117+
"import copy\n",
118+
"bus1 = Bus(['Alice', 'Bill', 'Claire', 'David'])\n",
119+
"# 使用浅拷贝\n",
120+
"bus2 = copy.copy(bus1)\n",
121+
"# 使用深拷贝\n",
122+
"bus3 = copy.deepcopy(bus1)\n",
123+
"bus1.drop('Bill')\n",
124+
"bus2.passengers"
125+
]
126+
},
127+
{
128+
"cell_type": "code",
129+
"execution_count": 7,
130+
"id": "3a0d3fdb",
131+
"metadata": {},
132+
"outputs": [
133+
{
134+
"data": {
135+
"text/plain": [
136+
"['Alice', 'Bill', 'Claire', 'David']"
137+
]
138+
},
139+
"execution_count": 7,
140+
"metadata": {},
141+
"output_type": "execute_result"
142+
}
143+
],
144+
"source": [
145+
"bus3.passengers"
146+
]
147+
},
148+
{
149+
"cell_type": "markdown",
150+
"id": "6a67e690",
151+
"metadata": {},
152+
"source": [
153+
"## 6.2 防御可变参数"
154+
]
155+
},
156+
{
157+
"cell_type": "code",
158+
"execution_count": 8,
159+
"id": "aa4c09bf",
160+
"metadata": {},
161+
"outputs": [],
162+
"source": [
163+
"class TwilightBus:\n",
164+
" \"\"\"让乘客销声匿迹的校车\"\"\"\n",
165+
"\n",
166+
" def __init__(self, passengers=None):\n",
167+
" if passengers is None:\n",
168+
" self.passengers = [] \n",
169+
" else:\n",
170+
" # WARN:不能直接引用变量,应使用浅拷贝\n",
171+
" self.passengers = passengers\n",
172+
"\n",
173+
" def pick(self, name):\n",
174+
" self.passengers.append(name)\n",
175+
"\n",
176+
" def drop(self, name):\n",
177+
" self.passengers.remove(name)"
178+
]
179+
},
180+
{
181+
"cell_type": "code",
182+
"execution_count": 10,
183+
"id": "2d3fad06",
184+
"metadata": {},
185+
"outputs": [
186+
{
187+
"data": {
188+
"text/plain": [
189+
"['Sue', 'Maya', 'Diana']"
190+
]
191+
},
192+
"execution_count": 10,
193+
"metadata": {},
194+
"output_type": "execute_result"
195+
}
196+
],
197+
"source": [
198+
"basketball_team = ['Sue', 'Tina', 'Maya', 'Diana', 'Pat']\n",
199+
"bus = TwilightBus(basketball_team)\n",
200+
"bus.drop('Tina')\n",
201+
"bus.drop('Pat')\n",
202+
"# 下车的学生从篮球队中消失了!\n",
203+
"basketball_team"
204+
]
205+
},
206+
{
207+
"cell_type": "code",
208+
"execution_count": 11,
209+
"id": "ee88a198",
210+
"metadata": {},
211+
"outputs": [],
212+
"source": [
213+
"# 修改后的代码\n",
214+
"class TwilightBus:\n",
215+
" \"\"\"让乘客销声匿迹的校车\"\"\"\n",
216+
"\n",
217+
" def __init__(self, passengers=None):\n",
218+
" if passengers is None:\n",
219+
" self.passengers = [] \n",
220+
" else:\n",
221+
" # 使用构造器的浅拷贝方式\n",
222+
" self.passengers = list(passengers)\n",
223+
"\n",
224+
" def pick(self, name):\n",
225+
" self.passengers.append(name)\n",
226+
"\n",
227+
" def drop(self, name):\n",
228+
" self.passengers.remove(name)"
229+
]
230+
},
231+
{
232+
"cell_type": "markdown",
233+
"id": "f92a2772",
234+
"metadata": {},
235+
"source": [
236+
"## 6.3 本章小结"
237+
]
238+
},
239+
{
240+
"cell_type": "markdown",
241+
"id": "ab233bbe",
242+
"metadata": {},
243+
"source": [
244+
"- 简单的赋值不创建副本,而是建立引用。\n",
245+
"- 对`+=`或`*=`增量赋值,如果左边的变量绑定的是不可变对象,则创建新对象,如果是可变对象,就地修改。\n",
246+
"- 为现有的变量赋予新值,不修改之前绑定的变量。如果变量是之前那个对象的最后一个引用,重新绑定了其他对象,则对象被当作垃圾回收。\n",
247+
"- 函数的形参以别名的形式传递,这意味着函数可能会修改通过实参传入的可变对象。\n",
248+
"- 使用可变类型作为函数参数的默认值,是危险的。如果修改了参数,默认值也会发生变化。"
249+
]
250+
}
251+
],
252+
"metadata": {
253+
"kernelspec": {
254+
"display_name": "Python 3 (ipykernel)",
255+
"language": "python",
256+
"name": "python3"
257+
},
258+
"language_info": {
259+
"codemirror_mode": {
260+
"name": "ipython",
261+
"version": 3
262+
},
263+
"file_extension": ".py",
264+
"mimetype": "text/x-python",
265+
"name": "python",
266+
"nbconvert_exporter": "python",
267+
"pygments_lexer": "ipython3",
268+
"version": "3.10.5"
269+
}
270+
},
271+
"nbformat": 4,
272+
"nbformat_minor": 5
273+
}

‎notes/images/06-01-python-vis.png

Copy file name to clipboard
92.7 KB
Loading

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.