Python知識點 python 全局變量引用與修改

Python 標識符

在 Python 裏,標識符由字母、數字、下劃線組成。html

在 Python 中,全部標識符能夠包括英文、數字以及下劃線(_),但不能以數字開頭。python

Python 中的標識符是區分大小寫的。c++

如下劃線開頭的標識符是有特殊意義的。app

單下劃線開頭 _foo 的表明不能直接訪問的類屬性,需經過類提供的接口進行訪問,不能用 from xxx import * 而導入;函數

雙下劃線開頭的 __foo 表明類的私有成員post

雙下劃線開頭和結尾的 __foo__ 表明 Python 裏特殊方法專用的標識,如 __init__() 表明類的構造函數。url

 


 

可更改(mutable)與不可更改(immutable)對象

在 python 中,strings, tuples, 和 numbers 是不可更改的對象,而 list,dict 等則是能夠修改的對象。spa

  • 不可變類型:變量賦值 a=5 後再賦值 a=10,這裏實際是新生成一個 int 值對象 10,再讓 a 指向它,而 5 被丟棄,不是改變a的值,至關於新生成了a。code

  • 可變類型:變量賦值 la=[1,2,3,4] 後再賦值 la[2]=5 則是將 list la 的第三個元素值更改,自己la沒有動,只是其內部的一部分值被修改了。htm

python 函數的參數傳遞:

  • 不可變類型:相似 c++ 的值傳遞,如 整數、字符串、元組。如fun(a),傳遞的只是a的值,沒有影響a對象自己。好比在 fun(a)內部修改 a 的值,只是修改另外一個複製的對象,不會影響 a 自己。

  • 可變類型:相似 c++ 的引用傳遞,如 列表,字典。如 fun(la),則是將 la 真正的傳過去,修改後fun外部的la也會受影響

python 中一切都是對象,嚴格意義咱們不能說值傳遞仍是引用傳遞,咱們應該說傳不可變對象和傳可變對象。

 

python 傳不可變對象實例

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
def ChangeInt( a ):
    a = 10

b = 2
ChangeInt(b)
print b # 結果是 2

實例中有 int 對象 2,指向它的變量是 b,在傳遞給 ChangeInt 函數時,按傳值的方式複製了變量 b,a 和 b 都指向了同一個 Int 對象,在 a=10 時,則新生成一個 int 值對象 10,並讓 a 指向它。

傳可變對象實例

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
# 可寫函數說明
def changeme( mylist ):
   "修改傳入的列表"
   mylist.append([1,2,3,4]);
   print "函數內取值: ", mylist
   return
 
# 調用changeme函數
mylist = [10,20,30];
changeme( mylist );
print "函數外取值: ", mylist

 

實例中傳入函數的和在末尾添加新內容的對象用的是同一個引用,故輸出結果以下:

函數內取值:  [10, 20, 30, [1, 2, 3, 4]]
函數外取值:  [10, 20, 30, [1, 2, 3, 4]]

python 全局變量引用與修改

更多見:https://www.cnblogs.com/yanfengt/p/6305542.html

命名空間和做用域

變量是擁有匹配對象的名字(標識符)。命名空間是一個包含了變量名稱們(鍵)和它們各自相應的對象們(值)的字典。

一個 Python 表達式能夠訪問局部命名空間和全局命名空間裏的變量。若是一個局部變量和一個全局變量重名,則局部變量會覆蓋全局變量。

每一個函數都有本身的命名空間。類的方法的做用域規則和一般函數的同樣。

Python 會智能地猜想一個變量是局部的仍是全局的,它假設任何在函數內賦值的變量都是局部的。

所以,若是要給函數內的全局變量賦值,必須使用 global 語句。

global VarName 的表達式會告訴 Python, VarName 是一個全局變量,這樣 Python 就不會在局部命名空間裏尋找這個變量了。

例如,咱們在全局命名空間裏定義一個變量 Money。咱們再在函數內給變量 Money 賦值,而後 Python 會假定 Money 是一個局部變量。然而,咱們並無在訪問前聲明一個局部變量 Money,結果就是會出現一個 UnboundLocalError 的錯誤。取消 global 語句的註釋就能解決這個問題。

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
Money = 2000
def AddMoney():
   # 想改正代碼就取消如下注釋:
   # global Money
   Money = Money + 1
 
print Money
AddMoney()
print Money

self表明類的實例,而非類

類的方法與普通的函數只有一個特別的區別——它們必須有一個額外的第一個參數名稱, 按照慣例它的名稱是 self。

class Test:
    def prt(self):
        print(self)
        print(self.__class__)
 
t = Test()
t.prt()

以上實例執行結果爲:

<__main__.Test instance at 0x10d066878>
__main__.Test

從執行結果能夠很明顯的看出,self 表明的是類的實例,表明當前對象的地址,而 self.class 則指向類。


 

格式化輸出  

能夠用以下的方式,對格式進行進一步的控制:

%[(name)][flags][width].[precision]typecode

(name)爲命名

flags能夠有+,-,' '或0。+表示右對齊。-表示左對齊。' '爲一個空格,表示在正數的左側填充一個空格,從而與負數對齊。0表示使用0填充。

width表示顯示寬度

precision表示小數點後精度

 好比:

print("%+10x" % 10)
print("%04d" % 5)
print("%6.3f" % 2.3)
相關文章
相關標籤/搜索