Python 使用函数更改参数值?

Python 使用函数更改参数值?,python,python-3.x,function,variables,arguments,Python,Python 3.x,Function,Variables,Arguments,看起来我只能使用函数更改可变变量的值,但是否可以更改不可变变量 代码 结果 所以,我的问题是,是否可以使用函数修改不可变变量?如果没有,为什么?python禁止人们这样做的原因是什么?在python中,列表通过对象引用传递。实际上,python中的所有内容都是一个对象,但当您将单个变量传递给函数时,如果值发生更改,它将创建该变量的本地副本;如果是列表,则它将创建一个本地副本,甚至比对上一个列表对象的引用还要多。因此,列表的值不会更改\ 你可以参考 您可以查看下面的示例以获得澄清 def fun1

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

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

在python中,列表通过对象引用传递。实际上,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
但是如果我们使用列表对象执行此操作:

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


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

# Output:
# 0x7f97e1589308
# 0x7f97e1589308

Y不是值,它只是一些到内存的绑定。当您将其传递给函数时,其内存地址将传递给函数(通过引用调用)。另一方面,x是值,当您将其传递给函数时,新的局部变量将使用相同的值创建。(在程序集级别,函数的所有参数都通过堆栈指针传递。x的值和y的地址被推送到堆栈指针。

如果您可以修改(更改)这些值就不会是不变的。这有点像询问哪些不会飞的鸟会飞。你可以返回一个新值,然后调用方可以绑定到同一个名称,但这与更改值本身不同,就像更改可变类型一样。@PatrickHaugh这是否意味着我必须在或者我在函数中修改它们?你说的“创建本地副本”是什么意思?Python不会创建第二个列表,然后在其中一个列表发生更改时更新。相反,调用者和被调用者都引用了同一个列表。@PatrickHaugh我在答案中编辑了一部分,以引用你的问题。请查看。
def fun(a):
    a=5
    print(hex(id(a)))

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

# Output:
# 0x555eb8890cc0
# 0x555eb8890d00
def fun(a):
    a.append(5)
    print(hex(id(a)))


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

# Output:
# 0x7f97e1589308
# 0x7f97e1589308