当前位置:  开发笔记 > 编程语言 > 正文

当我将一个新元素附加到TUPLE时,为什么它可以工作?

如何解决《当我将一个新元素附加到TUPLE时,为什么它可以工作?》经验,为你挑选了1个好方法。

由于元组是Python中不可变的数据类型,而元组理解不是一个问题,那么为什么使用圆括号而不是方括号的List理解能够正常工作并产生常规元组?

我认为使用圆括号来定义元组而不是列表(我知道我没有错).

根据我的理解,我将值附加到已经定义的元组,并且我能够更新元组,并且不应该发生(在Python中),因为元组是不可变的.

我没有收到任何错误,有人请告诉我这是一个合理的解释.

这是我的代码:

ignore = (r"^\@define\s")
x = tuple()
(x.append(True if re.search(regex, line) else False) for regex in ignore)
if True in x:
  print("How is this possible?")

juanpa.arriv.. 9

由于您使用的是生成器表达式,因此不会引发错误.

>>> x = tuple()
>>> x
()
>>> (x.append(i) for i in range(10))
 at 0x110bede60>

生成器被懒惰地评估,并且因为你甚至没有在变量中捕获生成器,所以它只是被垃圾收集.然而,看我的时候会发生什么用发电机:

>>> g = (x.append(i) for i in range(10))
>>> next(g)
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
AttributeError: 'tuple' object has no attribute 'append'

一个发电机是写迭代器快速,冷静的方式.一个发电机表达本质上是一种"发电机列表理解",但你可以通过写发电机yield:

>>> def my_generator():
...   yield 1
...   yield 3
...
>>> g = my_generator()
>>> next(g)
1
>>> next(g)
3
>>> next(g)
Traceback (most recent call last):
  File "", line 1, in 
StopIteration
>>> list(my_generator())
[1, 3]
>>>

现在,关于生成器表达式的一个很酷的事情是你可以将它们与tuple构造函数结合起来,它可以使用任何可迭代的东西,并且你有一个穷人的元组理解!*注意,如果只有一个参数,可以将括号放在函数参数中:

>>> tuple(x for x in range(20))
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19)
>>>

顺便说一句,你永远不应该运行这样的代码:

>>> x = []
>>> [x.append(i) for i in range(10)]
[None, None, None, None, None, None, None, None, None, None]
>>> x
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

首先,它是浪费的,因为它创建了一个None完全没用的列表.其次,它将功能结构,列表理解与状态变化(.append)混合,这是一种不好的形式.Python程序员希望列表理解不要这样做.只需使用for循环来执行命令式代码.



1> juanpa.arriv..:

由于您使用的是生成器表达式,因此不会引发错误.

>>> x = tuple()
>>> x
()
>>> (x.append(i) for i in range(10))
 at 0x110bede60>

生成器被懒惰地评估,并且因为你甚至没有在变量中捕获生成器,所以它只是被垃圾收集.然而,看我的时候会发生什么用发电机:

>>> g = (x.append(i) for i in range(10))
>>> next(g)
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
AttributeError: 'tuple' object has no attribute 'append'

一个发电机是写迭代器快速,冷静的方式.一个发电机表达本质上是一种"发电机列表理解",但你可以通过写发电机yield:

>>> def my_generator():
...   yield 1
...   yield 3
...
>>> g = my_generator()
>>> next(g)
1
>>> next(g)
3
>>> next(g)
Traceback (most recent call last):
  File "", line 1, in 
StopIteration
>>> list(my_generator())
[1, 3]
>>>

现在,关于生成器表达式的一个很酷的事情是你可以将它们与tuple构造函数结合起来,它可以使用任何可迭代的东西,并且你有一个穷人的元组理解!*注意,如果只有一个参数,可以将括号放在函数参数中:

>>> tuple(x for x in range(20))
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19)
>>>

顺便说一句,你永远不应该运行这样的代码:

>>> x = []
>>> [x.append(i) for i in range(10)]
[None, None, None, None, None, None, None, None, None, None]
>>> x
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

首先,它是浪费的,因为它创建了一个None完全没用的列表.其次,它将功能结构,列表理解与状态变化(.append)混合,这是一种不好的形式.Python程序员希望列表理解不要这样做.只需使用for循环来执行命令式代码.

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有