@@ -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