-
Notifications
You must be signed in to change notification settings - Fork 1
/
leakvar.html
150 lines (138 loc) · 9.7 KB
/
leakvar.html
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
<!DOCTYPE html>
<html lang="vi">
<head>
<title>Tin tức Python PyMI.vn</title>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta charset="utf-8" />
<link href="https://n.pymi.vn/feeds/all.atom.xml" type="application/atom+xml" rel="alternate" title="Tin tức Python PyMI.vn Full Atom Feed" />
<!-- twitter card metadata -->
<meta name="twitter:site" content="">
<meta name="twitter:title" content="Python leak var">
<meta name="twitter:description" content="rồi sẽ có ngày bạn gặp bug">
<!-- OG Tags -->
<meta property="og:url" content="./leakvar.html"/>
<meta property="og:title" content="Python leak var | Tin tức Python PyMI.vn" />
<meta property="og:description" content="rồi sẽ có ngày bạn gặp bug" />
<!-- favicon -->
<!-- moment.js for date formatting -->
<script src="./theme/js/moment.js"></script>
<!-- css -->
<link rel="stylesheet" type="text/css" href="./theme/css/main.css" />
<script>
/*! grunt-grunticon Stylesheet Loader - v2.1.2 | https://github.com/filamentgroup/grunticon | (c) 2015 Scott Jehl, Filament Group, Inc. | MIT license. */
(function(e){function t(t,n,r,o){"use strict";function a(){for(var e,n=0;u.length>n;n++)u[n].href&&u[n].href.indexOf(t)>-1&&(e=!0);e?i.media=r||"all":setTimeout(a)}var i=e.document.createElement("link"),l=n||e.document.getElementsByTagName("script")[0],u=e.document.styleSheets;return i.rel="stylesheet",i.href=t,i.media="only x",i.onload=o||null,l.parentNode.insertBefore(i,l),a(),i}var n=function(r,o){"use strict";if(r&&3===r.length){var a=e.navigator,i=e.Image,l=!(!document.createElementNS||!document.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect||!document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#Image","1.1")||e.opera&&-1===a.userAgent.indexOf("Chrome")||-1!==a.userAgent.indexOf("Series40")),u=new i;u.onerror=function(){n.method="png",n.href=r[2],t(r[2])},u.onload=function(){var e=1===u.width&&1===u.height,a=r[e&&l?0:e?1:2];n.method=e&&l?"svg":e?"datapng":"png",n.href=a,t(a,null,null,o)},u.src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==",document.documentElement.className+=" grunticon"}};n.loadCSS=t,e.grunticon=n})(this);(function(e,t){"use strict";var n=t.document,r="grunticon:",o=function(e){if(n.attachEvent?"complete"===n.readyState:"loading"!==n.readyState)e();else{var t=!1;n.addEventListener("readystatechange",function(){t||(t=!0,e())},!1)}},a=function(e){return t.document.querySelector('link[href$="'+e+'"]')},c=function(e){var t,n,o,a,c,i,u={};if(t=e.sheet,!t)return u;n=t.cssRules?t.cssRules:t.rules;for(var l=0;n.length>l;l++)o=n[l].cssText,a=r+n[l].selectorText,c=o.split(");")[0].match(/US\-ASCII\,([^"']+)/),c&&c[1]&&(i=decodeURIComponent(c[1]),u[a]=i);return u},i=function(e){var t,o,a;o="data-grunticon-embed";for(var c in e)if(a=c.slice(r.length),t=n.querySelectorAll(a+"["+o+"]"),t.length)for(var i=0;t.length>i;i++)t[i].innerHTML=e[c],t[i].style.backgroundImage="none",t[i].removeAttribute(o);return t},u=function(t){"svg"===e.method&&o(function(){i(c(a(e.href))),"function"==typeof t&&t()})};e.embedIcons=i,e.getCSS=a,e.getIcons=c,e.ready=o,e.svgLoadedCallback=u,e.embedSVG=u})(grunticon,this);
grunticon(["./theme/css/icons.data.svg.css", "./theme/css/icons.data.png.css", "./theme/css/icons.fallback.css"]);
</script>
<noscript><link href="./theme/css/icons.fallback.css" rel="stylesheet"></noscript>
<!-- menu toggle javascript -->
<script type="text/javascript">
document.addEventListener("DOMContentLoaded", initMenu);
function initMenu(){
var menu = document.getElementById("menu");
var menulink = document.getElementById("menu-link");
menulink.addEventListener("click", function toggleMenu(){
window.event.preventDefault();
menulink.classList.toggle('active');
menu.classList.toggle('active');
});
};
</script>
<meta name="description" content="rồi sẽ có ngày bạn gặp bug" />
<meta name="tags" content="bug" />
<meta name="tags" content="fixbug" />
<meta name="tags" content="variable" />
<meta name="tags" content="feature" />
<meta name="tags" content="exp" />
<meta name="tags" content="best practice" />
</head>
<body>
<div role="banner" id="masthead">
<header>
<h1><a href="/">Pymiers's Blog</a></h1>
<a href="#menu" id="menu-link">more stuff</a>
<nav id="menu">
<ul>
<li><a href="./category/features.html">features</a></li>
<li class="active"><a href="./category/news.html">news</a></li>
<li><a href="./category/pymivn.html">pymi.vn</a></li>
</ul>
</nav>
</header>
</div>
<div class="page" role="main">
<div class="article" role="article">
<article>
<footer>
<a name="top"></a>
<p>
<time datetime=" 2022-08-10 00:00:00+07:00">
<script>document.write(moment('2022-08-10 00:00:00+07:00').format('LL'));</script>
</time>
</p>
</footer>
<header>
<h2>
Python leak var
</h2>
<center>
<h4>
by Pymier0
</h4>
</center>
</header>
<div class="content">
<p><img alt="img" src="https://images.unsplash.com/photo-1645220305088-85956fc0d482?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwyMzI1MzN8MHwxfHJhbmRvbXx8fHx8fHx8fDE2NjAxNDAwODM&ixlib=rb-1.2.1&q=80&w=600"></p>
<p>Python có một “tính năng” rất bất ngờ nếu bạn đã lập trình các ngôn ngữ khác:</p>
<div class="highlight"><pre><span></span><code><span class="n">i</span> <span class="o">=</span> <span class="s2">"Bánh Trung Thu"</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">5</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="c1"># cái này hiện ra gì?</span>
</code></pre></div>
<p>tất cả các i trong đoạn code trên đều là 1 i, đầu tiên nó là string, sau đó được gán cho các số 0 tới 4, sau vòng for nó… giữ giá trị cuối cùng: 4</p>
<p>Tính năng này không có ở hầu hết các ngôn ngữ lập trình khác, và thậm chí với Python, nó cũng là 1 bug, nhưng vì đã tồn tại quá lâu và không thể sửa mà không ảnh hưởng tới các đoạn code đã tồn tại, nên người ta giữ nó, coi như 1 tính năng.</p>
<p>Tính năng này sẽ có ngày khiến bạn vò đầu bứt tai, càng dễ gặp khi làm đúng các best practice đặt tên có nghĩa. Ví dụ:</p>
<div class="highlight"><pre><span></span><code><span class="n">name</span> <span class="o">=</span> <span class="s2">"ABC"</span>
<span class="n">send_to_slack</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">send_to_telegram</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">if</span> <span class="n">send_to_slack</span><span class="p">:</span>
<span class="o">...</span>
<span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">names</span><span class="p">:</span>
<span class="n">send_message_to</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="o">...</span>
<span class="c1">#10 dòng sau</span>
<span class="o">...</span>
<span class="o">...</span>
<span class="k">if</span> <span class="n">send_to_telegram</span><span class="p">:</span>
<span class="o">...</span>
<span class="n">do_something_with_name</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
</code></pre></div>
<p>Việc dùng <code>name</code> trong vòng lặp for vô tình đã thay mất giá trị của <code>name</code> đã
có trước, và chỉ ảnh hưởng tới câu if số 2 nếu câu if số 1 được chạy.</p>
<p>Một lỗi không luôn xảy ra, cũng không dễ dàng nhìn ra.</p>
<h3>Kết luận</h3>
<ul>
<li>best practice không phải lúc nào cũng best, dùng biến <code>i</code> hay <code>n</code> cho vòng lặp là <span class="caps">OK</span> .</li>
<li>TRÁNH dùng lại tên biến. Ví dụ:
<code>py
students = ["Pikachu", "Doremon"]
students = ",".join(students)</code></li>
</ul>
<p>Hết.</p>
<p>Đăng ký ngay tại <a href="https://pymi.vn">PyMI.vn</a> để học Python tại Hà Nội <span class="caps">TP</span> <span class="caps">HCM</span> (Sài Gòn),
trở thành lập trình viên #python chuyên nghiệp ngay sau khóa học.</p>
</div>
<div class="back-to-top">
<a href="#top">back to top</a>
</div>
</article>
</div>
<!-- end article -->
<footer>
<div class="icons">
<a href="https://github.com/pymivn" target="_blank"><div class="icon-github icon"></div></a>
</div>
<p>© <script>document.write(moment().format('YYYY'));</script> Pymiers</p>
</footer>
</div>
</body>
</html>