Python和Scala的變數作用域

2021-08-17 02:42:21 字數 2283 閱讀 6858

今天聊的主題是變數作用域,也就是定義的變數可以使用的一片區域。變數通常意義指的是乙個儲存著識別符號和識別符號所關聯的值的空間。在程式的執行過程中,識別符號會繫結上相應的值,在某些情況下,識別符號對應的值是可以發生變化的。什麼是變數作用域呢?在維基上給出的定義是

「the scope of a variable describes where in a program's text the variable may be used, while the extent (or lifetime) describes when in a program's execution a variable has a (meaningful) value. 」簡而言之就是兩點,在何處可以使用變數以及識別符號繫結的值生存多久。

那麼在具體的語言scala和python是如何處理變數作用域的呢?

scala:

scala在變數宣告時就確定了它的作用域範圍,最常見的作用域是用乙個花括號括起來的區域,這就是乙個新的作用域。我們可以看乙個簡單的例子:

object variable

}

我們會發現編譯器會報如下的錯誤:

error:(8, 11) a is already defined as

value a

val a = 2

意味著變數a一旦定義好就不能在相同的作用域再次定義了相同名字的變數,除非我們又新建了乙個作用域:

object variable

println(a)

}}

這樣就能正常輸出了,因為兩次定義的變數a都在不同的作用域裡。記住這裡的分號是必須要加上的,否則scala會認為大括號這裡沒有定義變數名。值得一提的是在scala裡的內嵌作用域的變數是會忽略外部作用域相同名稱的變數,這一點在scala的repl中尤為明顯,因為每一行代表著乙個新的作用域。

scala> val a = 1

a: int = 1

scala> val a = 2

a: int = 2

那麼就容易理解函式和類的定義體的區域性變數的含義了,例如:

object variable

def test(x:int):int =

}

我們會發現這裡的x只能在test內部使用,外部是無法獲取的到x變數的,內部也無法獲取外部的變數y。每次的函式呼叫,都意味著新的區域性變數的誕生。

python:

python的變數不同於scala,它的變數實際上乙個字串物件,和它所指向的物件關聯。python的作用域規則最出名的就是legb,這四個字母的含義代表著python的對於變數的查詢順序locals -> enclosing -> globals -> builtins。這代表著如下例子是可以執行的:

__builtins__.b = "b" 

g = "g"

def test():

e = "e"

def enclosing():

l = "l"

print(l,e,g,b)

enclosing()

test()

test()輸出的結果就是l e g b。這四個變數代表著四個不同的作用域,不同於scala內部作用域無法獲取外部作用域變數,這裡輸出的結果表示函式的區域性變數是可以獲得外部作用域的變數。對此,《流暢的python》作者給出的解釋是這**於python的設計選擇而不是缺陷。除此之外,python會假定在函式定義體中賦值的變數都是區域性變數。所以導致了下面奇特的print(b)

b = 6

def test1(a):

print(a)

print(b)

b = 9

test1(2)

2traceback (most recent call last):

file "", line 1, in

test1(2)

file "", line 4, in test1

print(b)

unboundlocalerror: local variable 'b' referenced before assignment

這裡的b無法獲得外部定義的b=6,如果我們把b = 9刪除,就會發現b可以使用了。

def test2(a):

print(a)

print(b)

test2(1)

16

python的常量和變數 python變數和常量

變數 什麼是變數?變數,是用於在記憶體中存放程式資料的容器 計算機的最核心功能就是 計算 計算需要資料來源,資料來源要存在記憶體裡,比如我要把小明的姓名 身高 年齡資訊存下來,後面程式會呼叫。怎樣定義乙個變數?直接設定乙個 變數名 值 name 小明 age 22height 160 怎樣呼叫變數?...

python的類變數和成員變數

先看看下面 python view plain copy class testclass object val1 100 def init self self val2 200def fcn self val 400 val3 300 self val4 val self val5 500if na...

Python的變數和型別

python中可以處理任意大小整數,包括負數,例如 23,0,54。由於計算機使用二進位制,所以有時使用16進製制更方便,16進製制是由0x加上0 9a f組成的,例如0x27a74f。在python中,不同進製的數可以直接運算,不需要統一進製 print 45678 0x12fd2 123456 ...