-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstring_and_integer_interning.py
More file actions
125 lines (100 loc) · 3.53 KB
/
string_and_integer_interning.py
File metadata and controls
125 lines (100 loc) · 3.53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
from sys import intern
# # 字串中有空白者不intern
# name1 = ' Alex Van is a Pythonista. '
# name2 = ' Alex Van is a Pythonista. '
# print(f'{name1 = }\t\t\t{name2 = }')
# print(f'{id(name1) = :<28}{id(name2) = }')
# print(f'{(id(name1) == id(name2)) = }')
# -------------------
# 改用intern()函數。
# name1 = intern(' Alex Van is a Pythonista. ')
# name2 = intern(' Alex Van is a Pythonista. ')
# print(f'{name1 = }\t\t\t{name2 = }')
# print(f'{id(name1) = :<28}{id(name2) = }')
# print(f'{(id(name1) == id(name2)) = }')
# ======================================================
# 內含ASCII 128以上字元者不intern
# os1 = 'Linux©' # ©是ASCII 128以上的字元。
# os2 = 'Linux©'
# print(f'{os1 = }\t\t\t{os2 = }')
# print(f'{id(os1) = :<22}{id(os2) = }')
# print(f'{(id(os1) == id(os2)) = }')
# -------------------
# 改用intern()函數。
# os1 = intern('Linux©')
# os2 = intern('Linux©')
# print(f'{os1 = }\t\t\t{os2 = }')
# print(f'{id(os1) = :<22}{id(os2) = }')
# print(f'{(id(os1) == id(os2)) = }')
# ++++++++
# name1 = '張曼玉'
# name2 = '張曼玉'
# print(f'{name1 = }\t\t{name2 = }')
# print(f'{id(name1) = :<20}{id(name2) = }')
# print(f'{(id(name1) == id(name2)) = }')
# -------------------
# 改用intern()函數。
# name1 = intern('張曼玉')
# name2 = intern('張曼玉')
# print(f'{name1 = }\t\t{name2 = }')
# print(f'{id(name1) = :<20}{id(name2) = }')
# print(f'{(id(name1) == id(name2)) = }')
# ======================================================
# 長度超過4,096個字元的字串不intern
# leng = 4097
# str1 = 'A' * 4097 # 連用5個4_096,何以不用變數?
# str2 = 'A' * 4097 # Alex是否功力大退?
# str3 = 'A' * 4097 # 當然不是。
# str4 = 'A' * 4097 # 請耐心看下去,自然明白。
# str5 = 'A' * 4097
# print(f'{id(str1)=:<20}{id(str2)=:<20}{id(str3)=:<20}{id(str4)=:<20}{id(str5)=}')
# print(f'{(id(str1) == id(str2) == id(str3) == id(str4) == id(str5)) = }')
# -------------------
# 改用intern()函數。
# str1 = intern('A' * 4_097)
# str2 = intern('A' * 4_097)
# print(f'{id(str1)=:<20}{id(str2)=:<20}')
# print(f'{(id(str1) == id(str2)) = }')
# ======================================================
# 字串由variable組合而成者不intern
# first = 'first'
# last = 'last'
# name1 = 'first' + 'last'
# name2 = 'first' + last
# print(f'{name1 = }\t\t{name2 = }')
# print(f'{id(name1) = :<20}{id(name2) = }')
# print(f'{(id(name1) == id(name2)) = }')
# -------------------
# 改用intern()函數。
# str1 = intern('A' * 4_097)
# str2 = intern('A' * 4_097)
# print(f'{id(str1)=:<20}{id(str2)=:<20}')
# print(f'{(id(str1) == id(str2)) = }')
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
# ^^ 整數 ^^
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
# num1 = -5 # implicit的整數interning範圍為-5 ~ 256。
# num2 = -5
# print(f'{num1 = }\t\t{num2 = }')
# print(f'{id(num1) = :<20}{id(num2) = }')
# print(f'{(id(num1) == id(num2)) = }')
# print()
num1 = -6**19
num2 = -6**19
print(f'{num1 = }\t\t{num2 = }')
print(f'{id(num1) = :<20}{id(num2) = }')
print(f'{(id(num1) == id(num2)) = }')
print(f'{num1 is num2 = }')
# print()
# num1 = 256
# num2 = 256
# print(f'{num1 = }\t\t{num2 = }')
# print(f'{id(num1) = :<20}{id(num2) = }')
# print(f'{(id(num1) == id(num2)) = }')
# print()
# num = 999999999999999999999999*9999999999999999999999999999999999*999999999999999999999999
# num1 = num
# num2 = num
# print(f'{num1 = }\t\t{num2 = }')
# print(f'{id(num1) = :<20}{id(num2) = }')
# print(f'{(id(num1) == id(num2)) = }')