看起来我只能使用一个函数来更改可变变量的值,但是可以更改不可变
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禁止人们这样做的原因是什么?
答案 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的地址被压入堆栈指针。