<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ## 問題 你想在使用范圍內執行某個代碼片段,并且希望在執行后所有的結果都不可見。 ## 解決方案 為了理解這個問題,先試試一個簡單場景。首先,在全局命名空間內執行一個代碼片段: ~~~ >>> a = 13 >>> exec('b = a + 1') >>> print(b) 14 >>> ~~~ 然后,再在一個函數中執行同樣的代碼: ~~~ >>> def test(): ... a = 13 ... exec('b = a + 1') ... print(b) ... >>> test() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 4, in test NameError: global name 'b' is not defined >>> ~~~ 可以看出,最后拋出了一個NameError異常,就跟在?`<span class="pre" style="box-sizing: border-box;">exec()</span>`?語句從沒執行過一樣。 要是你想在后面的計算中使用到?`<span class="pre" style="box-sizing: border-box;">exec()</span>`?執行結果的話就會有問題了。 為了修正這樣的錯誤,你需要在調用?`<span class="pre" style="box-sizing: border-box;">exec()</span>`?之前使用?`<span class="pre" style="box-sizing: border-box;">locals()</span>`?函數來得到一個局部變量字典。 之后你就能從局部字典中獲取修改過后的變量值了。例如: ~~~ >>> def test(): ... a = 13 ... loc = locals() ... exec('b = a + 1') ... b = loc['b'] ... print(b) ... >>> test() 14 >>> ~~~ ## 討論 實際上對于?`<span class="pre" style="box-sizing: border-box;">exec()</span>`?的正確使用是比較難的。大多數情況下當你要考慮使用?`<span class="pre" style="box-sizing: border-box;">exec()</span>`?的時候, 還有另外更好的解決方案(比如裝飾器、閉包、元類等等)。 然而,如果你仍然要使用?`<span class="pre" style="box-sizing: border-box;">exec()</span>`?,本節列出了一些如何正確使用它的方法。 默認情況下,`<span class="pre" style="box-sizing: border-box;">exec()</span>`會在調用者局部和全局范圍內執行代碼。然而,在函數里面, 傳遞給?`<span class="pre" style="box-sizing: border-box;">exec()</span>`?的局部范圍是拷貝實際局部變量組成的一個字典。 因此,如果?`<span class="pre" style="box-sizing: border-box;">exec()</span>`?如果執行了修改操作,這種修改后的結果對實際局部變量值是沒有影響的。 下面是另外一個演示它的例子: ~~~ >>> def test1(): ... x = 0 ... exec('x += 1') ... print(x) ... >>> test1() 0 >>> ~~~ 上面代碼里,當你調用?`<span class="pre" style="box-sizing: border-box;">locals()</span>`?獲取局部變量時,你獲得的是傳遞給?`<span class="pre" style="box-sizing: border-box;">exec()</span>`?的局部變量的一個拷貝。 通過在代碼執行后審查這個字典的值,那就能獲取修改后的值了。下面是一個演示例子: ~~~ >>> def test2(): ... x = 0 ... loc = locals() ... print('before:', loc) ... exec('x += 1') ... print('after:', loc) ... print('x =', x) ... >>> test2() before: {'x': 0} after: {'loc': {...}, 'x': 1} x = 0 >>> ~~~ 仔細觀察最后一步的輸出,除非你將?`<span class="pre" style="box-sizing: border-box;">loc</span>`?中被修改后的值手動賦值給x,否則x變量值是不會變的。 在使用?`<span class="pre" style="box-sizing: border-box;">locals()</span>`?的時候,你需要注意操作順序。每次它被調用的時候,?`<span class="pre" style="box-sizing: border-box;">locals()</span>`?會獲取局部變量值中的值并覆蓋字典中相應的變量。 請注意觀察下下面這個試驗的輸出結果: ~~~ >>> def test3(): ... x = 0 ... loc = locals() ... print(loc) ... exec('x += 1') ... print(loc) ... locals() ... print(loc) ... >>> test3() {'x': 0} {'loc': {...}, 'x': 1} {'loc': {...}, 'x': 0} >>> ~~~ 注意最后一次調用?`<span class="pre" style="box-sizing: border-box;">locals()</span>`?的時候x的值是如何被覆蓋掉的。 作為?`<span class="pre" style="box-sizing: border-box;">locals()</span>`?的一個替代方案,你可以使用你自己的字典,并將它傳遞給?`<span class="pre" style="box-sizing: border-box;">exec()</span>`?。例如: ~~~ >>> def test4(): ... a = 13 ... loc = { 'a' : a } ... glb = { } ... exec('b = a + 1', glb, loc) ... b = loc['b'] ... print(b) ... >>> test4() 14 >>> ~~~ 大部分情況下,這種方式是使用?`<span class="pre" style="box-sizing: border-box;">exec()</span>`?的最佳實踐。 你只需要保證全局和局部字典在后面代碼訪問時已經被初始化。 還有一點,在使用?`<span class="pre" style="box-sizing: border-box;">exec()</span>`?之前,你可能需要問下自己是否有其他更好的替代方案。 大多數情況下當你要考慮使用?`<span class="pre" style="box-sizing: border-box;">exec()</span>`?的時候, 還有另外更好的解決方案,比如裝飾器、閉包、元類,或其他一些元編程特性。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看