l = []
d = {} def add_value(): d['frank'] = 'yangcaho' l.append(d) add_value() print(l) print(d) 輸出: [{'frank': 'yangcaho'}] {'frank': 'yangcaho'}
l = []
d = {} def add_value(): global l global d d['frank'] = 'yangcaho' l.append(d) add_value() print(l) print(d) 輸出: [{'frank': 'yangcaho'}] {'frank': 'yangcaho'}
a = 'frank'
def add_value():
global a a = 'yangchao' add_value() print(a) yangchao
a = 'frank'
def add_value():
b = a + 'yangchao'
print(b) add_value() print(a) frankyangchao frank
結論:可使用定義在函數外的全局變量的值(假設在函數內沒有同名的變量)。但強烈建議儘可能避免這樣作,由於這使得程序的讀者會不清楚這個變量是在哪裏定義的。使用global語句能夠清楚地代表變量是在外面的塊定義的。app
可變對象如list的.paaend()操做與‘+’操做,的一些不一樣點。函數
l = ['frank', 'liuilu'] print(id(l)) L = l + ['yangchao'] print(id(L)) print(l) print(id(l)) 36364616 36365960 ['frank', 'liuilu'] 36364616
l = ['frank', 'liuilu'] print(id(l)) l += ['yangchao'] print(l) print(id(l)) 43639112 ['frank', 'liuilu', 'yangchao'] 43639112
l = []
d = {} def add_value(): for i in range(1, 3): print('第%s次循環' %i) d['age'] = i print(d) print('#' * 10) print(l) print('#' * 10) l.append(d) print(l) add_value() 輸出結果 第1次循環 {'age': 1} ########## [] ########## [{'age': 1}] 第2次循環 {'age': 2} ########## [{'age': 2}] ########## [{'age': 2}, {'age': 2}]
可是函數內若是是用賦值的方式(以下面兩種模式),那麼函數中的d就再也不是全局變量中的d了。因此有了每次賦值操做(即’=‘),每次append的d都是新的值。不會改變原來的值。ui
l = []
d = {} def add_value(): for i in range(1, 3): print('第%s次循環' %i) d = {'age', i} print(d) print('#' * 10) print(l) print('#' * 10) l.append(d) print(l) add_value() 第1次循環 {1, 'age'} ########## [] ########## [{1, 'age'}] 第2次循環 {2, 'age'} ########## [{1, 'age'}] ########## [{1, 'age'}, {2, 'age'}]
l = []
def add_value(): for i in range(1, 3): d = {} print('第%s次循環' %i) d['age'] = i print(d) print('#' * 10) print(l) print('#' * 10) l.append(d) print(l) add_value() 第1次循環 {'age': 1} ########## [] ########## [{'age': 1}] 第2次循環 {'age': 2} ########## [{'age': 1}] ########## [{'age': 1}, {'age': 2}]
a = []
b = [] c = {} d = {} e = 'frank' f = 'frank' print(id(a), id(b), id(c), id(d), id(e), id(f))
43770760 43770824 31284896 31284968 31302408 31302408
可見每次建立一個空的可變對象時,都會從新開闢內存,但不可變對象就是指向原來的的地址空間。spa