【问题标题】:Lists are mutable but tuples are immutable, then how is the value of x changed when running function tuple?列表是可变的,但元组是不可变的,那么运行函数元组时 x 的值是如何变化的呢?
【发布时间】:2021-03-29 16:31:22
【问题描述】:

我写了 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 碰巧是哪种可迭代的并不重要。
  • 你没有改变任何对象在任何一种情况下
  • 如何更改我的代码以使其不返回新列表而不是更新它?@jonrsharpe

标签: python


【解决方案1】:

让我们看看这个例子。

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

【讨论】:

    【解决方案2】:

    元组以这种方式是不可变的:

    x = ("apple", "banana", "cherry")
    x[0]='ananas'
    

    TypeError: 'tuple' 对象不支持项目分配

    在您的第二个示例中,您没有更改元组。 相反,您正在定义一个列表的新变量。

    【讨论】:

      【解决方案3】:

      您最好了解您在此处尝试执行的操作。您创建的函数正在创建一个新列表。如果你打印出你的 x,你会看到它没有被改变。

      这里有几篇文档/文章可以帮助您更好地理解可变与不可变... python docsreal python explanation

      祝你探索 python 好运!

      【讨论】:

        猜你喜欢
        • 2021-01-10
        • 1970-01-01
        • 2018-12-30
        • 1970-01-01
        • 2020-02-01
        • 2011-10-04
        • 2020-03-23
        • 1970-01-01
        相关资源
        最近更新 更多