使用函数更改参数值?

时间:2018-07-09 14:07:32

标签: python python-3.x function variables arguments

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

代码

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

2 个答案:

答案 0 :(得分:1)

在python中,该列表由 object-reference 传递。实际上,python中的所有内容都是一个对象,但是当您传递一个变量以使其起作用时,如果更改了值,它将创建该对象的本地副本;但是如果是列表,则如果它创建了本地副本,则即使创建了引用,其引用仍会保留到上一个列表宾语。因此,列表的值将不会更改。\

您可以参考link

您可以查看以下示例进行澄清。

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

答案 1 :(得分:0)

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