首页 > 解决方案 > 使用函数更改参数值?

问题描述

看起来我只能使用函数更改可变变量的值,但是否可以更改不可变

代码

def f(a, b):
    a += 1
    b.append('hi')

x = 1
y = ['hello']
f(x, y)
print(x, y) #x didn't change, but y did

结果

1 [10, 1]

所以,我的问题是可以使用函数修改不可变变量吗?如果没有,那为什么?python禁止人们这样做的原因是什么?

标签: pythonpython-3.xfunctionvariablesarguments

解决方案


在 python 中,列表由object-reference传递。实际上,python 中的所有内容都是一个对象,但是当您将单个变量传递给函数时,如果值发生更改,它会创建该变量的本地副本,但如果是列表,则如果它创建本地副本,即使引用仍然保留在前一个列表中目的。因此列表的值不会改变。\

你可以参考链接

您可以查看以下示例以进行说明。

def fun1(b):
    for i in range(0,len(b)):
        b[i]+=4

arr=[1,2,3,4]
print("Before Passing",arr)
fun2(arr)
print("After Passing",arr)

#output
#Before Passing [1, 2, 3, 4]
#After Passing [5, 6, 7, 8]

如果您不希望任何函数意外更改值,则可以使用不可变对象,例如元组。

编辑:(复制示例)

我们可以通过打印两个对象的 id 来检查它。

def fun(a):
    a=5
    print(hex(id(a)))

a=3
print(hex(id(a)))
fun(a)

# Output:
# 0x555eb8890cc0
# 0x555eb8890d00

但是如果我们用List对象来做:

def fun(a):
    a.append(5)
    print(hex(id(a)))


a=[1,2,3]
print(hex(id(a)))
fun(a)

# Output:
# 0x7f97e1589308
# 0x7f97e1589308

推荐阅读