当前位置:天才代写 > tutorial > Python教程 > 留意for轮回中变量的浸染域

留意for轮回中变量的浸染域

2017-11-02 08:00 星期四 所属: Python教程 浏览:500

for e in collections:
    pass

在for 轮回里, 最后一个工具e一直存在在上下文中。就是在轮回外面,接下来对e的引用仍然有效。

这里有个问题容易被忽略,假如在轮回之前已经有一个同名工具存在,这个工具是被包围的。

假如在有代码感知的IDE中, IDE会提示变量是“被从头声明的”, 但运行时却不会堕落。 

for轮回不是闭包,可以利用dis模块解析以下代码可以看到:

x = 5
for x in range(10):
    pass
print x

将代码生存到test.py文件,运行python -m dis test.py

C:\Users\Patrick\Desktop>python -m dis test.py

  1           0 LOAD_CONST               0 (5)

              3 STORE_NAME               0 (x)

  3           6 SETUP_LOOP              20 (to 29)

              9 LOAD_NAME                1 (range)

             12 LOAD_CONST               1 (10)

             15 CALL_FUNCTION            1

             18 GET_ITER

        >>   19 FOR_ITER                 6 (to 28)

             22 STORE_NAME               0 (x)

  4          25 JUMP_ABSOLUTE           19

        >>   28 POP_BLOCK

  6     >>   29 LOAD_NAME                0 (x)

             32 PRINT_ITEM

             33 PRINT_NEWLINE

             34 LOAD_CONST               2 (None)

             37 RETURN_VALUE

在其他语言里,for轮回的初始化变量对付上下文同样是可见的,好比java, 因为java是强范例的语言, 假如从头声明已存在的变量IDE会提示错误, 虽然差异通过编译。

凡是在python编程中(大概是大大都的动态语言),有时纵然声明白同名的变量,措施没有呈现明明的错误,可是一旦堕落,错误很难被发明。所以要制止与for轮回中的变量重名。

在利用python模板语言编码时尤其如此。代码编辑器没有提示,不会发明错误在那边。这个是我遇到的极其独特的一个例子。为什么说独特,因为逻辑上没有任何问题。

在一个页面模板内里,当handler挪用这个模板时,同时通报了两个工具(从handler中,我利用tornado),一个page工具和一个pages列表。我的顺序是这样的:

<!– 用page工具 –>

<label>{{ page.name if page else ''}}</label>

<!– 用pages工具 –>

<label>Parent Page

    <select name="parent_id">

        {% if pages %}

            {% for page in pages%}

            <option value="{{ page.id}}">{{page.name}}</option>

            {% end %}

        {% end %}

        <option value="">None</option>

    </select>

</label>

<!– 然后又page –>

<div>{{ page.markdown if page else ''}}</div>

问题来了,在运行的时候堕落了,提示在 <label>{{ page.name if page else ''}}</label> 中错误page referenced before assignment.

晕死了, 找了一晚上的错,最后在把for轮回中page的名字改为_page才运行了。

在模板挪用进程里,模板语言也是被翻译到python字节码,并按行理会和出,所以基础没有逻辑,不知道是tornado模板语言的bug。

所以留意变量名。

总之我认为tornado的exception trace很是不友好。

Python中变量的浸染域搜索顺序:当地浸染域(Local)→当前浸染域被嵌入的当地浸染域(Enclosing locals)→全局/模块浸染域(Global)→内置浸染域(Built-in)

 

    关键字:

天才代写-代写联系方式