为了账号安全,请及时绑定邮箱和手机立即绑定

使用函数更改参数值?

使用函数更改参数值?

婷婷同学_ 2021-04-01 10:11:03
看来我只能使用一个函数来更改可变变量的值,但是可以更改不可变的代码def f(a, b):    a += 1    b.append('hi')x = 1y = ['hello']f(x, y)print(x, y) #x didn't change, but y did结果1 [10, 1]因此,我的问题是可以使用函数修改不可变变量吗?如果没有,那为什么呢?python禁止人们这样做的原因是什么?
查看完整描述

2 回答

?
芜湖不芜

TA贡献1796条经验 获得超7个赞

在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


查看完整回答
反对 回复 2021-04-27
?
富国沪深

TA贡献1790条经验 获得超9个赞

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


查看完整回答
反对 回复 2021-04-27
  • 2 回答
  • 0 关注
  • 220 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信