python - 列表是可变的,但元组是不可变的,那么在运行函数元组时,x的值是如何变化的呢?
问题描述
我写了 2 个函数来尝试理解不可变和可变之间的区别,其中一个函数有一个分配给列表的变量,另一个分配给一个元组。在运行第一个函数(在列表的情况下)之后,它会打印 x 的更新值,但这不应该发生在元组中,因为元组是不可变的,对吧?他们怎么都打印更新的x。
列表
x = [1, 2, 3, 1, 2, 3]
def changeThem(x,y,z):
return [z if i == y else i for i in x]
print(changeThem(x, 2, 'zzz'))
元组
x = ("apple", "banana", "cherry")
def changeThem(x,y,z):
return [z if i == y else i for i in x]
print(changeThem(x, "apple", 'zzz'))
解决方案
让我们看看这个例子。
x_list = [1, 2, 3, 1, 2, 3]
x_tuple = (1, 2, 3, 1, 2, 3)
def change_them_comprehension(x, y, z):
return [z if i == y else i for i in x]
def change_them_manual(x, y, z):
for idx, i in enumerate(x):
if i == y:
x[idx] = z
return x
print("list")
print(id(x_list)) # 1877716860160
print(id(change_them_comprehension(x_list, 2, 'zzz'))) # 1877716698368
print(id(change_them_manual(x_list, 2, 'zzz'))) # 1877716860160
print("tuple")
print(id(x_tuple)) # 1877716262336
print(id(change_them_comprehension(x_tuple, 2, 'zzz'))) # 1877716698368
print(id(change_them_manual(x_tuple, 2, 'zzz'))) # TypeError: 'tuple' object does not support item assignment
请注意您如何change_them
返回一个新的列表理解,它与原始列表完全不同(请参阅它们具有不同的 id)。这不涉及突变;而不是编辑列表,而是返回一个新列表(在原始元组和原始列表情况下)。
现在检查change_them_manual
。此方法确实编辑输入列表/元组,而不是创建新的。查看返回的列表如何相同(相同的 id)。我们可以编辑它,因为列表是可变的。然而,当我们尝试对元组做同样的事情时,我们会得到一个错误,告诉我们不能编辑元组,这就是不可变的意思。
推荐阅读
- python - 如何对两个元组列表求和
- java - 如何在 Map java 中允许重复值?
- c# - C# 属性分配错误
- mongodb - DynamoDB 等效于 find().sort()
- javascript - 我如何将文本区域的内容限制为文本区域的高度?
- java - JNA 将 HICON 转换为 Java 图像
- excel - 条件格式不允许我运行我的代码
- ruby-on-rails - 用户如何在 Rails 中只查看自己的帖子?
- amazon-web-services - AWS CodePipeline:在 CodeBuild 中获取 CloudFormation 输出
- jquery - 了解机器人日志 (log.html) 文件构建