在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java  Python  網(wǎng)絡安全  HTML/ python 和 js 變量作用域問題的不理解

python 和 js 變量作用域問題的不理解

本人目前剛學習python, 遇到了關于變量作用域的一些問題, 如下:

下面這個就不是非常明白

a = 3
def f():
    a += 4
    print(a)
f() # UnboundLocalError: local variable 'a' referenced before assignment

然后如果稍微改一下:

a = 3
def f():
    b = a + 4
    print(a)
f() # 3

這里新聲明了一個變量b, 對a進行了引用, 然后就可以訪問到a了, 不是明白為什么

另外如果將代碼 1 換成js, 結果又不同

var a = 3
const f = () => {
    a += 4
    console.log(a)
}
a() // 7
f() // 7

js中不僅僅能夠訪問到全局變量, 甚至可以對全局變量進行修改, 所以在js里面作用域機制和python又有什么區(qū)別?

另外, 本人所了解到jspython都是靜態(tài)作用域, 原理應該相同, 但是上面顯示的結果卻很不一樣, 麻煩能有前輩清楚的解答一下, 本人才學疏淺, 見諒!

回答
編輯回答
巷尾

python
a += 4 其實就是a = a + 4

此時 相當于在函數(shù)內(nèi)部聲明了變量 a, 所以是調(diào)用不到外部的a的。

而在 js 中 a 并不是聲明的新變量,所以結果會不同。

js 中聲明變量是需要 var 之類的關鍵字的,python 不需要

如果想要python 中的 a 的指向全局需要明確指定

a = 3
def f():
    global a // 明確指定是全局變量
    a += 4
    print(a)
f()

python 的代碼轉(zhuǎn)換為 js 代碼其實是這樣的:

var a = 3;
const f = () => {
    var a;
    a += 4;
    console.log(a) // NaN 因為js的容錯機制,所以并沒有報錯。
}
2018年4月28日 16:31
編輯回答
尐潴豬

我來給你解釋一下吧,
對于舉例中的python和js中var定義的變量,他們作用域規(guī)則相似

  1. 變量作用域在定義它的函數(shù)內(nèi)(整個python或js文件可以看做一個大函數(shù))
  2. 根據(jù)第1點:函數(shù)內(nèi)出現(xiàn)與全局中定義的同名變量,在函數(shù)內(nèi),它會覆蓋全局的。

不同點

  1. js函數(shù)內(nèi)定義變量要明確在變量名前寫上var(我們先不討論let和const),否則就是直接調(diào)用全局的
  2. python中定義變量直接寫變量名
  3. pyhton函數(shù)中如果想給全局變量賦值,需要在賦值之前寫上 global 變量名

基于以上前提知識,請看注釋中的解釋

Python的代碼

a = 3        # 全局的a
def f():
    a += 4   # a=a+4, 相當于先重新定義一個新變量a'(函數(shù)體f內(nèi)的a), 
             # 然后執(zhí)行a'+4時報錯:”沒有賦值就使用“
    print(a) # 沒執(zhí)行到這步就,已經(jīng)在上面報錯了。
f() #調(diào)用時被報錯
a = 3        # 全局的a
def f():
    global a # 加上這句后,下面再給賦值,就是針對全局變量了。
    a += 4   # 全局的a被加4,變?yōu)?了
    print(a) # 
f() #7
a = 3
def f():
    b = a + 4# 此處的a是全局的a
    print(a) # 打印的是全局的a,沒上面那句b的賦值此處也是全局的a
f() # 3

Javascript的代碼

var a = 3
const f = () => {
    a += 4             // 沒有用var,此處引用的是全局a
    console.log(a)
}
a   // 3  此處因為還沒執(zhí)行f函數(shù),a還沒有被改變 
f() // 7  你的問題描述中寫的4,正確是7
a   // 7  執(zhí)行過f(), 全局的a已經(jīng)被改變
2017年3月16日 02:34