python - 为什么python在定义函数时会这样处理列表?
问题描述
我正在编写代码,变量开始表现得很奇怪,并被分配给我认为它们不应该分配的东西。因此,我决定将情况降低到最小的复杂性以解决我的疑问,这就是发生的事情:
以下代码:
a = [2]
def changeA(c):
d = c
d[0] = 10
return True
changeA(a)
print(a)
打印“[10]”。这对我来说没有意义,因为在第一次分配之后我从未将列表“a”分配为任何内容。在函数 changeA 内部,局部变量 d 被分配为函数的输入,在我看来,这种分配是双向发生的,甚至改变了“外部”。如果是这样,为什么?如果不是,为什么会这样?
我还注意到代码
a = [2]
def changeA(c):
d = list(c)
d[0] = 10
return True
changeA(a)
print(a)
表现正常(即,如我所料)。
编辑:这个问题被认为是这个问题的重复。我不认为这是真的,因为这里也涉及到函数内部过程的局部性特征被违反了。
解决方案
Python 变量是对对象的引用,有些对象是可变的。数字不是,字符串和元组也不是,但列表、集合和字典是。
让我们看看下面的 Python 代码
a = [2] # ok a is a reference to a mutable list
b = a # b is a reference to the exact same list
b[0] = 12 # changes the value of first element of the unique list
print(a) # will display [12]
推荐阅读
- php - 从 lkdkjya 文件格式恢复数据
- node.js - 如何使用环回将字符串存储为objectId
- c# - 将下拉值从字符串转换为 int
- php - 我应该如何为多站点 Codeigniter 应用程序配置重定向?
- azure - Azure CDN:如何重写特定页面的 URL
- javascript - Selenium 使用 document.write 查找元素
- asp.net-core-mvc - 如何在asp.net core mvc + electronNET中安装jquery?
- c# - 如何访问类型的“静态”实例成员?
- c++ - 为什么 x64 上的函数 Epilog 中没有“离开”指令?
- apache-beam - Apache Beam - 监控管道并查询阶段的状态