很抱歉,如果标题不正确,请不确定如何正确命名。 问题是。如果我执行此代码:
navbar-expand-md
该数字显然将保持为1 但是如果我对对象做类似的事情
num = 1
def test_func2(arg):
arg = 10
test_func2(num)
print(num)
test_obj.one的值将更改为10。为什么值和用户定义的对象通过引用传递整数?
答案 0 :(得分:2)
在第一种情况下,num
引用值为1
的整数对象。将其传递给函数会分配arg
来引用值1
的相同整数对象,但是随后arg
被重新分配给值的新整数对象10
。 num
仍在引用值1
的原始整数对象。
在第二种情况下,test_obj
被分配了新TestClass
实例的值。将其传递给函数会将arg
分配给相同 TestClass
实例。对象本身已更改,arg
和test_obj
仍然引用相同的对象,因此即使函数返回后,test_obj
也“看到”更改。
答案 1 :(得分:0)
发生这种情况是因为-
在第一种情况下,将变量传递给函数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
当您将对象传递给函数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