兩行python代碼,你是否可猜到運行結果


兩行python代碼,你是否可猜到運行結果

參考: http://www.cnblogs.com/way_testlife/archive/2011/07/20/2111549.html#2156893

代碼如下

#!/usr/bin/env python
#-*- encoding: utf-8 -*-

def func(a, b=[]):
b.append(a)
print b

''' 運行結果如下:
[1]
[1, 2]
[1, 2, 3]
[1, 2, 3, 4]
['hello', 'world', 5]
原因:b列表沒有釋放,默認參數b保留了前面調用所進行的修改。
'''
func(1)
func(2)
func(3)
func(4)
l = ['hello', 'world']
func(5, l)

'''運行結果如下:
will.change
{'Name': 'Allen'}
will.change
{'Hobby': 'basketball'}

原因分析:
這里有一個變量名解析的原則:LEGB。即當引用一個變量時,
Python 按以下順序依次進行查找,
從本地變量中,在任意上層函數的作用域,在全局作用域,最后在內置作用域中查找。
本地變量 < 任意上層函數的作用域 < 全局變量 < 內置作用域
第一個完成查找的就算成功。變量在代碼中被賦值的位置通常就決定了它的作用域。

函數TT中的Name就是函數T的參數1,
而(Name=2)是作為字典傳給kwargs的,用Name做字典的key很有迷惑性啊。其實(Name=2)中的Name和(print Name)中的Name完全兩回事。
'''
def T(Name):
def TT(**kwargs):
print Name
print kwargs
return TT

T('will.change')(Name = 'Allen')
T('will.change')(Hobby = 'basketball')

運行如下

[1]
[1, 2]
[1, 2, 3]
[1, 2, 3, 4]
['hello', 'world', 5]
will.change
{'Name': 'Allen'}
will.change
{'Hobby': 'basketball'}

原因分析

見程序中的注釋


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com