def func(n, m):
n = 10 + m
def func2(n, m):
n[0] = 10 + m
n[1] = 10 - m
def func3(n, m):
print("n:", n) #>>>n: [1, 3, 5]
n = m
print("n:", n) #>>>n: 10
a = 10
b = [1,2,3,4]
c = [1,3,5]
func(a, 2)
func2(b, 5)
func3(c, 10)
print(a) #>>>10
print(b) #>>>[15, 5, 3, 4]
print(c) #>>>[1, 3, 5]
如上代码看出,a变量值没有改变,b数组变量的值发生了改变。
上面a变量和func函数的n参数指向的是不同的内存地址,a变量只是把值赋值给了n参数,a的值并没有改变。
b数组传参到func2函数的n,在func2函数中改变了n数组下标0和1的值,也就是说,在func2函数中,创建出新的值,在列表中赋值,b数组下标0、1引用新的值。
再看c数组和func3函数结果,可以看出,m赋值给n,n指向了新的内存地址,没有有改变数组中的值。
主要注意的是func2和func3的传参,一个是修改数组中的下标值,一个是直接把形参n重赋值,n指向了m传入的值。函数接收的形参中如果为可修改的对象,引用传入的对象,可对参入对象的属性进行修改。当传入为不可修改对象时,传入的参数为赋值传递参数。