两行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'}

原因分析

见程序中的注释

原文地址:https://www.cnblogs.com/ZhangRuoXu/p/6706468.html