代码之家  ›  专栏  ›  技术社区  ›  com

函数定义中的Python变量范围[重复]

  •  1
  • com  · 技术社区  · 7 年前

    我对下面的Python代码感到非常惊讶

    def f(x,l=[]):
        for i in range(x):
            l.append(i*i)
        print(l) 
    
    f(2) #[0, 1]
    f(3) #[0, 1, 0, 1, 4]
    

    问题是Python为什么使用相同的 l 在函数定义中,列表始终定义为 l=[]

    2 回复  |  直到 7 年前
        1
  •  1
  •   Ron Dahlgren    7 年前

    默认值在函数定义时绑定。在将字典或列表指定为默认值时,这是一个常见的“陷阱”。

    有关其他详细信息,请参见 this blog post ,其中有一个关于可变默认值的部分。

    当python解释器第一次看到函数定义时,可以将其视为创建对象并将其绑定到形式参数名。从那时起,当调用函数时,如果不存在用户提供的值,则会向函数提供相同的可变对象。

    一开始这当然是一个惊喜,但符合python的工作方式。

        2
  •  1
  •   Julien    7 年前

    因为它在函数定义处创建一个空列表,并将对该对象的引用设置为默认参数。此默认引用始终指向同一对象。