不可變對象(immutable):int、string、float、number、tupleapp
可變對象(mutable):dict、list函數
對於基本數據類型的變量,變量傳遞給函數後,函數會在內存中複製一個新的變量,從而不影響原來的變量。(咱們稱此爲值傳遞)spa
可是對於list來講,列表傳遞給函數的是一個指針,指針指向序列在內存中的位置,在函數中對錶的操做將在原有內存中進行,從而印象原有變量。(咱們稱此爲指針傳遞)指針
如何定義函數?對象
關於不可變對象類型的函數定義、調用和傳參: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,類對象這樣表明一個集合的話,能夠對傳入參數的內部作修改,引發外部變量值的變化。可是對同名的外部變量直接賦值,是不會改變外部變量的結果的。