Python-按值和按引用函数参数

时间:2018-12-26 08:31:26

标签: python pass-by-value

很抱歉,如果标题不正确,请不确定如何正确命名。 问题是。如果我执行此代码:

navbar-expand-md

该数字显然将保持为1 但是如果我对对象做类似的事情

num = 1

def test_func2(arg):
    arg = 10

test_func2(num)
print(num)

test_obj.one的值将更改为10。为什么值和用户定义的对象通过引用传递整数?

2 个答案:

答案 0 :(得分:2)

在第一种情况下,num引用值为1的整数对象。将其传递给函数会分配arg来引用值1相同整数对象,但是随后arg被重新分配给值的新整数对象10num仍在引用值1的原始整数对象。

在第二种情况下,test_obj被分配了新TestClass实例的值。将其传递给函数会将arg分配给相同 TestClass实例。对象本身已更改,argtest_obj仍然引用相同的对象,因此即使函数返回后,test_obj也“看到”更改。

答案 1 :(得分:0)

发生这种情况是因为-

  1. 在第一种情况下,将变量传递给函数test_func2(num)后,该值将被捕获到局部变量arg中,该变量的作用域是函数的局部范围。从函数返回后,由于函数结束了执行,变量被销毁了。

    num = 1
    
    def test_func2(arg): // arg catches value 1 here
       arg = 10 // arg variable changed to 10 but this value is not reflected back to num variable
               // so num is still 1
    
    test_func2(num) // function called with variable
    print(num) // that's why 1 gets printed here
    
  2. 当您将对象传递给函数test_func(test_obj)时,函数中的arg将引用它捕获的对象,即test_obj。这意味着在修改arg.one = 10之后,您实际上是在修改原始对象的值,即test_obj.one = 10

    def test_func(arg): // arg points to test_obj
      arg.one = 10 // actually changing test_obj.one
    
    test_func(test_obj) // function called with object
    print(test_obj.one) //that's why 10 gets printed here