Python函数范围

wza*_*lor 5 python

我有一个关于python函数范围的问题.我已经包含了一个示例,说明了我遇到的问题.

fun0重新定义了varible c列表中的第一个条目.这个变化反映在fun0之外,即使我没有从fun0返回任何值.

fun1完全重新定义变量c,但更改不会在fun1之外反映出来.同样,fun2重新定义了c,并且更改不会在fun2之外反映出来.

我的问题是,为什么fun0修改VAL3主要功能,同时FUN1FUN2不修改VAL4val7分别?

def fun0(a, b, c):
    c[0] = a[0] + b[0]
    return

def fun1(a, b, c):
    c = a[0] + b[0]
    return

def fun2(a, b, c):
    c = a + b
    return

def main():
    val1 = ['one']
    val2 = ['two']
    val3 = ['']
    fun0(val1, val2, val3)
    print val3

    val4 = []
    fun1(val1, val2, val4)
    print val4

    val5 = 1
    val6 = 1
    val7 = 0
    fun2(val5, val6, val7)
    print val7
    return

if __name__=='__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

Chr*_*ean 1

我的问题是,为什么fun0在main函数中修改了val3,而fun1和fun2分别没有修改val4和val7?

这是因为 Python 传递参数的方式。

当您将参数传递给函数时,Python 通过赋值来传递它们。这意味着它将参数引用绑定到参数名称。这是参数和参数名称关联的唯一方式。在第一个示例中,您只需传递对 的引用val3,并且由于 和val3c引用同一列表对象,因此更改会反映在两个名称中。

但是,当您在c函数内部重新分配时,您替换了对列表的引用c并重新分配了c新的引用。