python - 使用函数更改参数值?
问题描述
看起来我只能使用函数更改可变变量的值,但是否可以更改不可变
代码
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禁止人们这样做的原因是什么?
解决方案
在 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
推荐阅读
- python - 如何只下载新文件?
- apache-kafka - 带有 SASL-SSL-security-protocol (SCRAM-SHA-512) 的 Mule 4 Kafka 连接器
- python - 如何使用 python 编码以将 %E4 转换为 ä
- cadence-workflow - 重置失败(代码:deadline-exceeded message:timeout)
- python - 使用 Python 在元组数组中查找循环的长度
- android - 可变列表转换
- c# - 删除 IResultFilter 上的视图布局
- r - 绑定多个 CSV 文档并分配给变量
- python - Discord.py 机器人只回复一条消息
- azure - 通过 Azure 数据工厂创建 Blob 存储容器