考虑以下一段代码,它生成数组[1,2,3,...,n]的大小为k的所有子集:
def combinations(n, k):
result = []
directed_combinations(n, k, 1, [], result)
return result
def directed_combinations(n, k, offset, partial_combination, result):
if len(partial_combination) == k:
new_partial = [x for x in partial_combination]
result.append(new_partial)
return
num_remaining = k - len(partial_combination)
i = offset
# kind of checks if expected num remaining is no greater than actual num remaining
while i <= n and num_remaining <= n - i + 1:
partial_combination.append(i)
directed_combinations(n, k, i + 1, partial_combination, result)
del partial_combination[-1]
# partial_combination = partial_combination[:-1] <-- same funcationality as line above, but produces weird bug.
i += 1
print(combinations(n=4,k=2))
例如,组合(n=4,k=2)
将生成[1,2,3,4]的长度为2的所有子集。代码中有两行生成一个删除了最后一个元素的列表。我尝试用del
来实现,并通过切掉最后一个元素(即[-1]
)来创建一个全新的列表。带有del
的版本会生成正确的结果。但是,带有[-1]
的版本没有。没有运行时错误;只是一个逻辑错误(即不正确的结果)。
我怀疑这与在进行切片时创建新列表和使用del
保持相同列表有关。我似乎不明白为什么这是个问题。
我一开始并没有注意到您的函数是递归的(应该更好地阅读您的标记)。
你说得对,功能上这两者几乎是一样的。下面是完全相同的事情:
# del partial_combination[-1] # working (mutate)
# partial_combination = partial_combination[:-1] # different (rebind)
partial_combination[:] = partial_combination[:-1] # same (mutate)
以上每一个操作的结果都将是您最终得到一个包含相同元素的列表。但是,虽然del
和partial_combinite[:]
更改了原始列表,但中间的一个将名称重新绑定到具有相同元素的新列表。当您将这个新列表传递到下一个递归步骤时,它将在自己的副本上操作,而不是在前面的递归级别正在处理的单个列表上操作。
为了证明这一点,您可以在上述每个选项之后调用print(id(Partial_Combinition))
,并看到id
在重新绑定的情况下发生了变化,而在整个变化的情况下保持不变。
问题内容: 我是一个长期的python开发人员,最近被介绍给Prolog。我喜欢在某些任务中使用关系规则的概念,并希望将其添加到我的曲目中。 是否有用于Python逻辑编程的良好库?我已经在Google上进行了一些搜索,但发现以下内容: jtauber关于relational_python的博客系列 很想与其他人比较…谢谢! -aj 问题答案: 也许您应该使用Google“ Python逻辑编程”
根据H.264视频RFC的RTP有效载荷格式,在嗅探非idr片时,如何知道它与哪个idr片相关? 我在数据包中找不到任何配置它的区域,或者它只是与之前的idr片有关,根据序列号>
问题内容: 在阅读python中的逻辑运算符时,我遇到了一些表达式: 输出1 输出:5 谁能解释这是如何工作的? 我知道, 操作数 的的 逻辑 运算符是 布尔 问题答案: 有据可查: 两者都短路(例如,如果为 真,则不会评估)。 __ 该文档还指出了被认为 falsy (,,,空序列/映射,…) -一切被认为是 truthy 。 一些例子: 请注意,最后两个如何显示短路行为:不执行第二个语句(将引
我是一个编程新手。我在go编程书中读到过,片由三部分组成:指向数组的指针、长度和容量。 我感到困惑的零切片(切片没有底层数组指向,len=0,cap=0),非零切片只有len=0,cap=0和空切片。 谁能告诉我零和空切片是否是一回事?如果它们都不同,那么请告诉这两者之间的区别是什么? 如何测试一个切片是否为空? 另外,指针在长度和容量为零的非nil片中保留什么值?
本文向大家介绍详解Python中的元组与逻辑运算符,包括了详解Python中的元组与逻辑运算符的使用技巧和注意事项,需要的朋友参考一下 Python元组 元组是另一个数据类型,类似于List(列表)。 元组用"()"标识。内部元素用逗号隔开。但是元素不能二次赋值,相当于只读列表。 以上实例输出结果: 以下是元组无效的,因为元组是不允许更新的。而列表是允许更新的: Python逻辑运算符 Pytho
关于国家推行的35114安全认证,密钥对生成、数字签名、证书生成;以及摄像机如何兼容适配;有相关的核心流程和代码讲解吗