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

Sign up
Appearance settings

Commit 2f6aeab

Browse files
committed
update
1 parent a949f2a commit 2f6aeab

File tree

3 files changed

+1060
-1
lines changed

3 files changed

+1060
-1
lines changed

‎ch03.md‎

Lines changed: 157 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,4 +253,160 @@ static PyStringObject *characters[UCHAR_MAX + 1];
253253

254254
## 修改代码测试
255255

256-
好像 characters 不会缓冲'*'之类的特殊字符。
256+
好像 characters 不会缓冲'*'之类的特殊字符。
257+
258+
**更新:**
259+
关于这个问题我在 CPyUG发过[帖子](https://groups.google.com/forum/?hl=zh-CN#!topic/python-cn/Oszno8oGAXQ)。经过更多的测试,把我的发现记录一下。
260+
261+
262+
- 通过Python shell测试和使用Python执行脚本文件进行测试的结果不一致,下面是两者的测试结果
263+
264+
使用 `len('?')` 打印出 characters 中不为 NULL 的元素。
265+
266+
Python shell
267+
268+
```python
269+
>>> len('?')
270+
value: /(47), refcnt: 12
271+
value: 1(49), refcnt: 2
272+
value: E(69), refcnt: 1
273+
value: F(70), refcnt: 1
274+
value: N(78), refcnt: 1
275+
value: O(79), refcnt: 1
276+
value: R(82), refcnt: 1
277+
value: T(84), refcnt: 1
278+
value: W(87), refcnt: 1
279+
value: X(88), refcnt: 1
280+
value: _(95), refcnt: 7
281+
value: a(97), refcnt: 3
282+
value: c(99), refcnt: 4
283+
value: d(100), refcnt: 3
284+
value: e(101), refcnt: 2
285+
value: f(102), refcnt: 2
286+
value: g(103), refcnt: 1
287+
value: i(105), refcnt: 10
288+
value: k(107), refcnt: 8
289+
value: l(108), refcnt: 1
290+
value: m(109), refcnt: 6
291+
value: n(110), refcnt: 4
292+
value: o(111), refcnt: 1
293+
value: p(112), refcnt: 7
294+
value: r(114), refcnt: 2
295+
value: s(115), refcnt: 6
296+
value: t(116), refcnt: 4
297+
value: u(117), refcnt: 1
298+
value: w(119), refcnt: 3
299+
```
300+
301+
python t.py
302+
303+
```python
304+
# t.py
305+
len('?')
306+
307+
# 输出结果
308+
value: /(47), refcnt: 12
309+
value: 1(49), refcnt: 2
310+
value: ?(63), refcnt: 4
311+
value: E(69), refcnt: 1
312+
value: F(70), refcnt: 1
313+
value: N(78), refcnt: 1
314+
value: O(79), refcnt: 1
315+
value: R(82), refcnt: 1
316+
value: T(84), refcnt: 1
317+
value: W(87), refcnt: 1
318+
value: X(88), refcnt: 1
319+
value: _(95), refcnt: 7
320+
value: a(97), refcnt: 3
321+
value: c(99), refcnt: 4
322+
value: d(100), refcnt: 3
323+
value: e(101), refcnt: 2
324+
value: f(102), refcnt: 2
325+
value: g(103), refcnt: 1
326+
value: i(105), refcnt: 10
327+
value: k(107), refcnt: 8
328+
value: l(108), refcnt: 1
329+
value: m(109), refcnt: 6
330+
value: n(110), refcnt: 4
331+
value: o(111), refcnt: 1
332+
value: p(112), refcnt: 7
333+
value: r(114), refcnt: 2
334+
value: s(115), refcnt: 6
335+
value: t(116), refcnt: 4
336+
value: u(117), refcnt: 1
337+
value: w(119), refcnt: 3
338+
```
339+
340+
通过比较发现两者的结果大体是差不多的,但是第二个结果多了'?'。猜测多有一个'?'是因为t.py 中包含'?'。可是为什么在 Python shell 中,同样的`len('?')`却没有输出'?'呢?
341+
342+
- 当 Python shell 启动之后,似乎 characters 被"冻结"了,无法再获取它的值。
343+
344+
```python
345+
>>> len('?')
346+
value: /(47), refcnt: 12
347+
value: 1(49), refcnt: 2
348+
value: E(69), refcnt: 1
349+
value: F(70), refcnt: 1
350+
value: N(78), refcnt: 1
351+
value: O(79), refcnt: 1
352+
value: R(82), refcnt: 1
353+
value: T(84), refcnt: 1
354+
value: W(87), refcnt: 1
355+
value: X(88), refcnt: 1
356+
value: _(95), refcnt: 7
357+
value: a(97), refcnt: 3
358+
value: c(99), refcnt: 4
359+
value: d(100), refcnt: 3
360+
value: e(101), refcnt: 2
361+
value: f(102), refcnt: 2
362+
value: g(103), refcnt: 1
363+
value: i(105), refcnt: 10
364+
value: k(107), refcnt: 8
365+
value: l(108), refcnt: 1
366+
value: m(109), refcnt: 6
367+
value: n(110), refcnt: 4
368+
value: o(111), refcnt: 1
369+
value: p(112), refcnt: 7
370+
value: r(114), refcnt: 2
371+
value: s(115), refcnt: 6
372+
value: t(116), refcnt: 4
373+
value: u(117), refcnt: 1
374+
value: w(119), refcnt: 3
375+
1
376+
>>> a = 'x'
377+
>>> len('?')
378+
value: /(47), refcnt: 12
379+
value: 1(49), refcnt: 2
380+
value: E(69), refcnt: 1
381+
value: F(70), refcnt: 1
382+
value: N(78), refcnt: 1
383+
value: O(79), refcnt: 1
384+
value: R(82), refcnt: 1
385+
value: T(84), refcnt: 1
386+
value: W(87), refcnt: 1
387+
value: X(88), refcnt: 1
388+
value: _(95), refcnt: 8
389+
value: a(97), refcnt: 4
390+
value: c(99), refcnt: 4
391+
value: d(100), refcnt: 3
392+
value: e(101), refcnt: 2
393+
value: f(102), refcnt: 2
394+
value: g(103), refcnt: 1
395+
value: i(105), refcnt: 10
396+
value: k(107), refcnt: 8
397+
value: l(108), refcnt: 1
398+
value: m(109), refcnt: 6
399+
value: n(110), refcnt: 4
400+
value: o(111), refcnt: 1
401+
value: p(112), refcnt: 7
402+
value: r(114), refcnt: 2
403+
value: s(115), refcnt: 6
404+
value: t(116), refcnt: 4
405+
value: u(117), refcnt: 1
406+
value: w(119), refcnt: 3
407+
1
408+
```
409+
410+
第一次执行`len('?')`,输出结果中没有'x',当定义`a = 'x'`之后,再次执行`len('?')`,输出结果中仍然没有'x'。从 stringobject.c 的代码来看,创建字符串时,假如长度为1,则会将其缓存到 characters 中。
411+
412+
会不会是只有在 Python 启动时才会缓存 characters。

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /