第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

桃花長相依 2018-08-03 15:48:12
本人目前剛學習python, 遇到了關于變量作用域的一些問題, 如下:下面這個就不是非常明白a = 3def f():     a += 4     print(a) f() # UnboundLocalError: local variable 'a' referenced before assignment然后如果稍微改一下:a = 3def f():     b = a + 4     print(a) f() # 3這里新聲明了一個變量b, 對a進行了引用, 然后就可以訪問到a了, 不是明白為什么另外如果將代碼 1 換成js, 結(jié)果又不同var a = 3const f = () => {    a += 4     console.log(a) }a() // 7f() // 7在js中不僅僅能夠訪問到全局變量, 甚至可以對全局變量進行修改, 所以在js里面作用域機制和python又有什么區(qū)別?另外, 本人所了解到js與python都是靜態(tài)作用域, 原理應該相同, 但是上面顯示的結(jié)果卻很不一樣, 麻煩能有前輩清楚的解答一下, 本人才學疏淺, 見諒!
查看完整描述

2 回答

?
一只斗牛犬

TA貢獻1784條經(jīng)驗 獲得超2個贊

我來給你解釋一下吧,
對于舉例中的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        # 全局的adef 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        # 全局的adef f():    global a # 加上這句后,下面再給賦值,就是針對全局變量了。
    a += 4   # 全局的a被加4,變?yōu)?了
    print(a) # f() #7
a = 3def f():
    b = a + 4# 此處的a是全局的a
    print(a) # 打印的是全局的a,沒上面那句b的賦值此處也是全局的af() # 3

Javascript的代碼

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


查看完整回答
反對 回復 2018-08-05
?
烙印99

TA貢獻1829條經(jīng)驗 獲得超13個贊

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

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

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

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

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

a = 3def 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-08-05
  • 2 回答
  • 0 關注
  • 846 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號