Why can a function modify some arguments as perceived by the caller, but not others?

前端 未结 11 1220
盖世英雄少女心
盖世英雄少女心 2020-11-21 07:10

I\'m trying to understand Python\'s approach to variable scope. In this example, why is f() able to alter the value of x, as perceived within

11条回答
  •  醉梦人生
    2020-11-21 07:51

    I will rename variables to reduce confusion. n -> nf or nmain. x -> xf or xmain:

    def f(nf, xf):
        nf = 2
        xf.append(4)
        print 'In f():', nf, xf
    
    def main():
        nmain = 1
        xmain = [0,1,2,3]
        print 'Before:', nmain, xmain
        f(nmain, xmain)
        print 'After: ', nmain, xmain
    
    main()
    

    When you call the function f, the Python runtime makes a copy of xmain and assigns it to xf, and similarly assigns a copy of nmain to nf.

    In the case of n, the value that is copied is 1.

    In the case of x the value that is copied is not the literal list [0, 1, 2, 3]. It is a reference to that list. xf and xmain are pointing at the same list, so when you modify xf you are also modifying xmain.

    If, however, you were to write something like:

        xf = ["foo", "bar"]
        xf.append(4)
    

    you would find that xmain has not changed. This is because, in the line xf = ["foo", "bar"] you have change xf to point to a new list. Any changes you make to this new list will have no effects on the list that xmain still points to.

    Hope that helps. :-)

提交回复
热议问题