首页 > 解决方案 > 列表是可变的,但元组是不可变的,那么在运行函数元组时,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'))

标签: python

解决方案


让我们看看这个例子。

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)。我们可以编辑它,因为列表是可变的。然而,当我们尝试对元组做同样的事情时,我们会得到一个错误,告诉我们不能编辑元组,这就是不可变的意思。


推荐阅读