python 在堆(heap)中分配的物件分為兩類,可變物件和不可變物件
""" 物件的內容發生變化時,變數的物件引用是不會變化的 """
dict =
print "%s --> %d" % (dict, id(dict))
dict["a4"] = 4
print "%s --> %d" % (dict, id(dict))
# output
# --> 42838752
# --> 42838752
""" 不可變物件而言,儘管物件本身不可變,但變數的物件引用是可變的 """
print "123 --> %d" % (id(123))
a = 123
print "a = 123 --> %d" % (id(a))
b = 123
print "b = 123 --> %d" % (id(b))
b = b+1
print "b = b + 1 --> %d" % (id(b))
# output
# 123 --> 43153560
# a = 123 --> 43153560
# b = 123 --> 43153560
# b = b + 1 --> 43153548
python規定引數傳遞都是傳遞引用,也就是傳遞給函式的是原變數實際所指向的記憶體空間,修改的時候就會根據該引用的指向去修改該記憶體中的內容,所以在函式內改變了傳遞過來的引數的值的話,原來外部的變數也應該受到影響。但是python中有可變型別和不可變型別,這樣的話,當傳過來的是可變型別(list, dict)
時,在函式內部修改就會影響函式外部的變數。而傳入的是不可變型別時在函式內部修改改變量並不會影響函式外部的變數,因為修改的時候會先複製乙份再修改
def test(a_int, b_list, c_str, d_dict):
a_int = a_int + 1
c_str = c_str + "bbb"
d_dict["a4"] = 4
print "輸出區域性變數"
print 'outer a_int: %d' % (a_int)
print 'outer b_list: %s' % (b_list)
print 'outer c_str: %s' % (c_str)
print 'outer d_dict: %s\n' % (d_dict)
if __name__ == '__main__':
a_int = 5
b_list = [10, 11]
c_str = "aaa"
d_dict =
# 函式呼叫
test(a_int, b_list, c_str, d_dict)
print "輸出全域性變數"
print 'outer a_int: %d' % (a_int)
print 'outer b_list: %s' % (b_list)
print 'outer c_str: %s' % (c_str)
print 'outer d_dict: %s' % (d_dict)
# output ...
# 輸出區域性變數
# outer a_int: 6
# outer b_list: [10, 11, 13]
# outer c_str: aaabbb
# outer d_dict:
# 輸出全域性變數
# outer a_int: 5
# outer b_list: [10, 11, 13]
# outer c_str: aaa
# outer d_dict:
回到頂部 可變物件和不可變物件
要理解可變物件和不可變物件,先要理解final關鍵字。參考此部落格 沒有經過原博主的同意便引用了一些,侵刪!final關鍵字可以用來修飾類 方法和變數 成員或區域性 final修飾類時表明這個類不能被繼承。final類中的方法會被隱式的定義為fianl,變數自行定義需要不要被final修飾。fina...
可變物件,不可變物件
不可變物件為字串,元組等 可變物件為列表,字典,集合等。淺拷貝只是對已經存在的記憶體新增加乙個物件引用。深拷貝就是重新申請乙個新的記憶體,使這個是新物件是新記憶體位址的引用。對於可變物件引用時時經常出現。考慮以下兩段 1 l for i in range 10 num i print l 結果 2 ...
python 可變物件和不可變物件
變數沒有型別,那麼就意味著它可以隨意指向任何物件。python中的變數相當於乙個指標。當將乙個變數a賦值給另乙個變數b時,無論變數a指向的是可變物件還是不可變物件,變數b指向變數a指向的物件。例 alist 1 2,3 anolist alist id alist id anolist true b...