由于元组是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循环来执行命令式代码.
由于您使用的是生成器表达式,因此不会引发错误.
>>> 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循环来执行命令式代码.