偶然掉進了乙個坑里。仔細分析了下原因。原來是變數作用域的問題。簡單抽象如下:
id=1#許多行**
[id for id in range(10)]
#許多行**
if id!=1:
#做一些事情
pass
else:
#做另外一些事情
結果由於id在
[id for id in range(10)]
中受到了影響發生了變化,導致蟲蟲的產生。
索性探索了下變數作用域,結論如下:
1. 函式中的同名變數不會影響函式外的同名變數(若未加任何修飾--比如global)
id=1def test():
id=2
print id
#===1
2. 變數的最小作用域是乙個函式。在函式內部,變數的作用是從始至終的。(這不同於其他語言)
id = 1if true:
id=2
print id
#===2
id = 1
for i in range(10):
id=i
print i
#====9
同樣下面的也是ok的:
if true:b=1print b
輸出1,不會因為b在if/for/while下面而成為乙個區域性的臨時**塊變數!
變數的最小作用範圍是函式,甚至極端點,下面的也是輸出1的:
for i in range(10):for j in range(2):
if true:
if true:
if true:
c=1print c
變數作用域問題
2018 04 09 首先一定要明白乙個問題,那就是你py程式裡面的變數作用域問題。因為你程式是工作在乙個分布式機器上的,那麼這些個資料就會分布在不同的機器上,或者說container上。要明確spark的工作架構,各個不同的工作身份。那麼乙個變數他是不是在不同的機器執行,他是不是最後會彙總到我們的...
變數的作用域問題
變數的作用域和列表 全域性 在函式外部定義,在整個全域性範圍有效 區域性 在函式內部定義,區域性範圍使用 a1 100 def func print a1 print this is func a2 99 print a2 print a1 func print a2 不能訪問區域性變數 100 1...
python變數作用域
變數作用域 scope 在python中是乙個容易掉坑的地方。什麼是作用域 作用域簡單說就是乙個變數的命名空間。中變數被賦值的位置,就決定了哪些範圍的物件可以訪問這個變數,這個範圍就是命名空間。python賦值時生成了變數名,當然作用域也包括在內。python的作用域一共有4中,分別是 l loca...