python的函數調用和參數傳遞

不可變對象(immutable):int、string、float、number、tupleapp

可變對象(mutable):dict、list函數

對於基本數據類型的變量,變量傳遞給函數後,函數會在內存中複製一個新的變量,從而不影響原來的變量。(咱們稱此爲值傳遞)spa

可是對於list來講,列表傳遞給函數的是一個指針,指針指向序列在內存中的位置,在函數中對錶的操做將在原有內存中進行,從而印象原有變量。(咱們稱此爲指針傳遞)指針

如何定義函數?對象

  • def 關鍵詞開頭,後接函數標識符名稱和圓括號()
  • 任何傳入參數和自變量必須放在圓括號中間。圓括號之間能夠用於定義參數。
  • 函數內容以冒號起始,而且縮進。
  • return [表達式] 結束函數,選擇性地返回一個值給調用方。不帶表達式的return至關於返回 None。

關於不可變對象類型的函數定義、調用和傳參:blog

# -*- coding:utf-8 -*-

a = 1

def change_a_1(a):
    a += 1
    print a
    return a

def change_a_2(a):
    a += 1
    print a

print a
print change_a_1(a)   
print a
a = change_a_1(a)
print a
a = change_a_2(a)
print a

 最終打印出來的結果有幾個?又分別是什麼?主要涉及三個知識點,函數的定義、函數的調用以及傳參,一旦弄清楚了,就很容易回答這個問題了。內存

函數的定義:utf-8

a = 1

def change_a_1(a):
    a += 1
    print a
    return a

def change_a_2(a):
    a += 1
    print a

函數的調用:string

print change_a_1(a)
print a

 注意:函數的定義與函數的執行,是兩個過程。定義的函數若是不調用是不會執行的!table

因此說,最終的打印結果和返回結果以下:

print a          #1
print change_a_1(a) #2(函數return的返回值),2(函數內部的打印結果)
print a          #1
a = change_a_1(a)
print a          #2,2
a = change_a_2(a)
print a          #3(函數內部一次),None(最終打印結果)

 關於全局變量和局部變量:

若是函數內任意地方有賦值,那麼這個被解釋爲局部變量;

若是函數內沒有賦值,函數以前有賦值,那麼將被解釋爲全局變量。

注意:函數內部禁止使用全局變量!(#註釋後爲打印值)
def change_a_3(a):
    a = 6
    a += 1
    print a
    return a

a = 2
print change_a_3(a)      #7,7
print a                         #2
a = change_a_3(a)
print a                         #7,7

 關於可變對象類型的函數定義、調用和傳參:

b = [1, 2, 3, 4]


def change_b(b):
    b = b[1]
    print b
    return b

def change_b_1(b):
    b.append(13)
    print b
    return b

def change_b_2(b):
    b = [9, 7, 6, 6, 4]
    b.append(13)
    print b
    return b

print b       #[1,2,3,4]
b.pop(1)
print b       #[2,3,4]
print change_b(b)    #3,3
print b       #[2,3,4]
b = change_b(b)
print b       #3,3

b = [1, 2, 3, 4]
print change_b_1(b) #[1,2,3,4,13],[1,2,3,4,13]
print change_b_1(b) #[1,2,3,4,13,13],[1,2,3,4,13,13]
print change_b_2(b) #[9,7,6,6,4,13]
print change_b_2(b) #[9,7,6,6,4,13]

1.當函數的傳入參數表明惟一的值,也就是像int這種內部沒法改變的,外部的變量是沒法修改的。對同名的外部變量賦值,也沒法改變外部變量的值。2.當函數傳入參數是像list,dict,類對象這樣表明一個集合的話,能夠對傳入參數的內部作修改,引發外部變量值的變化。可是對同名的外部變量直接賦值,是不會改變外部變量的結果的。

相關文章
相關標籤/搜索