偶然掉进了一个坑里。仔细分析了下原因。原来是变量作用域的问题。简单抽象如下:

id=1
#许多行代码
[id for id in range(10)]
#许多行代码 if id!=1:
#做一些事情
pass
else:
#做另外一些事情

结果由于id在

[id for id in range(10)]

  中受到了影响发生了变化,导致虫虫的产生。

索性探索了下变量作用域,结论如下:

1. 函数中的同名变量不会影响函数外的同名变量(若未加任何修饰--比如global)

id=1
def test():
id=2 print id
#===1

2. 变量的最小作用域是一个函数。在函数内部,变量的作用是从始至终的。(这不同于其他语言)

id = 1
if True:
id=2 print id
#===2 id = 1
for i in range(10):
id=i
print i
#====9

同样下面的也是ok的:

if True:
b=1
print b

输出1,不会因为b在if/for/while下面而成为一个局部的临时代码块变量!

变量的最小作用范围是函数,甚至极端点,下面的也是输出1的:

for i in range(10):
for j in range(2):
if True:
if True:
if True:
c=1 print c

  

python的变量作用域问题的更多相关文章

  1. Python基础-变量作用域

    1.函数作用域介绍 函数作用域 Python中函数作用域分为4种情况: L:local,局部作用域,即函数中定义的变量: E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局 ...

  2. python的变量作用域

    import time global mark,sum def gaosi(Q): global sum,mark # 在 使用的时候防止隔离 也要声明一下 这个是全局变量 , 引用外面的值 sum+ ...

  3. Python之变量作用域

    使用 global强制声明为全局变量

  4. Python中的变量作用域

    python中变量作用域包括: L (Local) 局部作用域,函数内部声明但没有使用global的变量E (Enclosing) 闭包函数外的函数中,def或者lambda的本地作用域G (Glob ...

  5. python 变量作用域、闭包

    先看一个问题: 下面代码输出的结果是0,换句话说,这个fucn2虽然已经用global声明了variable1,但还是没有改变变量的值 def func1(): variable1=0 def fun ...

  6. python 本地变量和全局变量 locals() globals() global nonlocal 闭包 以及和 scala 闭包的区别

    最近看 scala ,看到了它的作用域,特此回顾一下python的变量作用域问题. A = 10 B = 100 print A #10 print globals() #{'A': 10, 'B': ...

  7. Python变量作用域(一)

    在一个程序中使用变量名时,Python创建.改变或者查找变量名都是在所谓的命名空间中进行的.作用域指的就是命名空间. Python中的变量名在第一次赋值时已经创建,并且必须经过赋值后才能够使用.由于变 ...

  8. Python中变量的作用域(variable scope)

    http://www.crifan.com/summary_python_variable_effective_scope/ 解释python中变量的作用域 示例: 1.代码版 #!/usr/bin/ ...

  9. Python 再谈变量作用域与变量引用

    再谈变量作用域与变量引用 by:授客 QQ:1033553122 module3.py #!/usr/bin/env python # -*- coding:utf-8 -*-   __author_ ...

随机推荐

  1. Clion cmake 一个简单的 C++ 程序

    CMakeLists.txt cmake_minimum_required(VERSION 3.5) project(dll) set(CMAKE_CXX_FLAGS "${CMAKE_CX ...

  2. ecshop 变量表

    get_goods_info($goods_id) 商品详情 get_sales_count($goods_id)  商品销量 get_promote_goods()   参与促销商品  Mobile

  3. SQL 查询总结

    参考资料: SELECT 查询语句格式与简单查询 SQL中distinct的用法 SQL 查询总结

  4. 我再也不-或许永远不-用zend studio-受够了!

    zend studio背负的东西太多, 想要整合php, js, aptana, emmet, 还要git, 所以显得很累. 不过把这些它整合的东西 都用上后, 用好后, 倒确实是php的开发利器. ...

  5. vim如何在多个文件中切换

    如果我们一次打开多个文件 看一下当前目录里面的文件: wangkongming@Vostro /data/webroot/testRoot/application/modules/Admin/view ...

  6. 一个简单的html5页面在线速成工具!(当然本文主要说下他的成果的结构)

    分享一个好玩的web app页面速成工具 当然主要是让大家看下他的原理 看着他的结构大家就该猜到这个了.这个是利用换页之后给当前div加了一个active,然后利用css控制效果 这个毫无疑问是采用最 ...

  7. WAMP启动失败简单解决方法

    一般情况下,直接选择安装,突然出现问题了:提示:msvcp110.dll或msvcr110.dll问题, 那么你直接复制这个来百度就行. 在百度会提示让你一键安装并且修复的. 或者你可能会看网上其他教 ...

  8. 黑客攻防技术宝典Web实战篇(一)Web应用程序技术基础

    在开展Web应用程序渗透测试之前请先了解下面列出的这些内容,如果不是很懂的话,请读David Gourley & Brian Totty的HTTP权威指南也叫HTTP:The Definiti ...

  9. 2015年12月10日 spring初级知识讲解(二)最小化Spring XML配置 注解

    序,随着Spring容器管理Bean数量增加,XML文件会越来越大,而且纯手工配置XML很繁琐,Spring和JAVA都提供了一些注解方式用以简化XML配置. 目录 一.自动装配(autowiring ...

  10. jQuery属性选择器.attr()和.prop()两种方法

    在判断表单单选框是否被选中时,通常会想到使用$('#checkbox').attr('checked')来判断,但在一些情况下,你会发现这种方法并不管用,得到的是undefined. 原来jQuery ...