使用函数更改参数值?

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


代码

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禁止人们这样做的原因是什么?


婷婷同学_
浏览 223回答 2
2回答

芜湖不芜

在python中,列表是通过object-reference传递的。实际上,python中的所有内容都是一个对象,但是当您传递一个变量以使其起作用时,如果更改了值,它将创建该对象的本地副本,但是如果是列表,则如果它创建了本地副本,则即使引用仍保留到先前列表,它也会创建一个本地副本。目的。因此,列表的值将不会更改。\您可以参考链接。您可以检查以下示例以进行澄清。def fun1(b):    for i in range(0,len(b)):        b[i]+=4arr=[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=3print(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

富国沪深

Y并不重视它对内存的某些绑定。当您将其传递给函数时,其内存地址将传递给函数(按引用调用)。另一方面,x是值,当您将其传递给函数时,将使用相同的值创建新的局部变量。(在汇编级别,函数的所有参数都通过堆栈指针传递。x的值和y的地址被压入堆栈指针。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python