【问题标题】:Tuples in For Loops - Python [duplicate]For循环中的元组-Python [重复]
【发布时间】:2021-04-08 12:51:51
【问题描述】:

我想在 Python 中使用 for 循环从元组中的每个数字中减去 1

我不明白为什么我的代码返回的是原始元组而不是所需的元组。代码如下:

tuple = (3, 2)
for i in tuple:
  i -= 1
print(tuple)

有什么想法吗?

【问题讨论】:

  • 我认为尝试解释您的想法对您会有所帮助,以便其他人更容易指出这与代码工作方式的不同之处。问题的解决方法很简单:t = (3, 2); t = tuple(x - 1 for x in t)
  • 除了元组是不可变的事实之外,您没有尝试更新元组。您获取元组的每个元素并在没有任何进一步操作的情况下将它们递减。

标签: python python-3.x loops for-loop tuples


【解决方案1】:

元组是不可变的对象,也就是说,一旦创建元组,您就无法更改元组的元素,如果您确实想更改它们,最好使用list

a = [3, 2]
for i in a:
    i -= 1
print(a)

给出输出:

[3, 2]

为什么它不起作用,即使lists 是可变的?另外,如果tuples 真的不可变,为什么您的原始代码不会产生某种错误? 好吧,如果您将for each 样式循环编写为简单的for,这将变得更加明显:

for index in range(len(a)):
    i = a[index]
    i -= 1
print(a)

这段代码只是原始示例的一个更详细的版本,但现在问题很清楚了 - 代码实际上从未更改原始 list 的元素。相反,for 循环的每次迭代都会创建一个新变量 i,它的值来自相应的list 元素。 i -= 1 更改 i,而不是 a[index]

顺便说一句,这就是为什么您的原始代码中没有错误的原因,即使 tuples 应该是不可变的 - 代码根本不会尝试改变原始的 tuple

带有列表的工作示例如下:

a = [3, 2]
for index in range(len(a)):
    a[index] -= 1

print(a)

最后可以写得更简洁:

a = [3, 2]
a = [i - 1 for i in a]
print(a)

顺便说一句,如果您确实必须将tuples 作为输入并产生tuples 作为输出,您可以使用listtuple 函数在tuples 和lists 之间进行转换.这也是为什么你不应该使用tuple 作为你的变量名的原因!这样做意味着您不能在与您的 tuple 变量相同的范围内使用该 tuple 函数,这会使事情变得非常困难并且可能会让您感到困惑。

【讨论】:

    【解决方案2】:

    元组是immutable

    my_tuple = (1,2,3)
    my_tuple [0] = 3
    Traceback (most recent call last):
      File "<input>", line 1, in <module>
    TypeError: 'tuple' object does not support item assignment
    
    

    【讨论】:

    • 谢谢你的代码应该是:my_tuple = (1,2,3) my_tuple[0] = 3
    • 我已经编辑了代码
    【解决方案3】:

    发生了一些事情。 tuple 是不可变的,您将值 (3, 2) 分配给类型 tuple

    tup = (3, 2)
    for i in tup:
        i -= 1
    print(tup)
    

    输出:

    (3, 2)
    

    但是,您可以进行列表解析并将其转换为 tuple 以获得预期结果。

    tup = (3,2)
    tup = tuple([i - 1 for i in tup])
    print(tup)
    

    输出:

    (2, 1)
    

    【讨论】:

      【解决方案4】:

      元组是不可变的

      试试这个,我想它会帮助你。

      my_tuple = (3, 2)
      new_list = []
      for i in my_tuple:
          i -= 1
          new_list.append(i)
      new_tuple = tuple(new_list)
      print(new_tuple)
      

      【讨论】:

        【解决方案5】:

        对python数据结构的简单介绍应该可以帮助你here。这是要点

        元组是不可变的,即一旦创建,您就无法更改内容,您需要创建一个新的 - 您无法就地修改内容,类似于 strings 的工作方式在python中。

        list 是有道理的,但在您的情况下,它仍然不起作用,因为您需要在执行此操作时更新列表的内容:

        tuple = (3, 2)
        for i in tuple:
            i -= 1
        print(tuple)
        

        您基本上是从元组中提取内容并修改值,但没有将其存储在任何地方。即使您使用这样的列表

        list = [3,2]
        for i in list:
            i -= 1
        print(list)
        

        这仍然不起作用,因为您正在修改创建一个新项目的列表项(原始类型 - int、string 等),但由于它没有被存储,所以当您打印列表时它会丢失 - 它仍然存在一样的。

        我们可以做的是修改 list 使其在运行时可变,并像这样更新内容:

        list = [3, 2]
        for idx, item in enumerate(list):
            list[idx] = item - 1
        print(list)
        

        【讨论】:

          【解决方案6】:
          1. 我认为tuple 是元组的错误变量名,因为它会影响 Python 的元组

          2. 问题是分配给i 的值是整数,而整数本身是不可变的。因此,即使i 发生变化,元组中的值也不会发生变化。 换句话说,即使i 指向与元组中的整数相同的对象,但当您进行就地减法时,会形成一个新整数,i 现在指向它,不同于元组有什么。

          但是,如果你要放置一个可变对象并做类似的事情:

          tup = ([1, 2, 3], [4, -12])
          
          for i in tup:
              i[1] = 999
          
          print(tup)
          

          你得到

          ([1, 999, 3], [4, 999])
          

          【讨论】:

            猜你喜欢
            • 2020-10-18
            • 2016-10-04
            • 1970-01-01
            • 2018-09-11
            • 2021-11-11
            • 2019-01-08
            • 1970-01-01
            • 2010-11-14
            • 2018-11-11
            相关资源
            最近更新 更多