Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的元组数组_Python_Arrays - Fatal编程技术网

Python中的元组数组

Python中的元组数组,python,arrays,Python,Arrays,这让我快发疯了。下面的代码基本上就是问题所在。第一部分几乎立即停止。第二个似乎被卡住了。但是,他们应该做完全相同的事情,因为one==two one = [[(0,)]] + [[], [], [], [], [], [], [], [], []] n = 9 two = [[(0,)]] + ([[]] * n) if (one == two): print "It is indeed the same thing!" print "Fast:" strings = one pri

这让我快发疯了。下面的代码基本上就是问题所在。第一部分几乎立即停止。第二个似乎被卡住了。但是,他们应该做完全相同的事情,因为
one==two

one = [[(0,)]] + [[], [], [], [], [], [], [], [], []]
n = 9
two = [[(0,)]] + ([[]] * n)

if (one == two):
    print "It is indeed the same thing!"

print "Fast:"
strings = one
print str(strings)
for j in range(0, n):
    for i in strings[j]:
        strings[j + 1].append(i + (0,))
        strings[j + 1].append(i + (1,))

print "Slow:"
strings = two
print str(strings)
for j in range(0, n):
    for i in strings[j]:
        strings[j + 1].append(i + (0,))
        strings[j + 1].append(i + (1,))

Equals
=
测试数组是否“看起来”相同(使用标准的相等测试)

但是,它们不包含相同的对象!i、 e.对象引用不相同

is
测试数组是否实际相同

[]、[]、[]]
有三个不同的列表

[[]]*3
对同一列表有三个引用

因此,在
one
中,对于每个
j
,您将添加到不同的子列表中。但是在
two
中,您一直在添加到同一个子列表中


注意:使用
=
进行测试:
equals
是属于列表的一种方法,可以覆盖该方法以按照您想要的方式进行比较。它通常做“合理的事情”,在本例中,它涉及到查看列表的长度是否相同,如果相同,则查看每个元素是否相同——同时使用
=
。但另一方面,
,是一个更原始的东西:它从字面上看你是否真的在引用同一个内存对象


要创建多个新(不同)对象,可以执行以下操作

[ [] for i in range(9) ]

Equals
=
测试数组是否“看起来”相同(使用标准的相等测试)

但是,它们不包含相同的对象!i、 e.对象引用不相同

is
测试数组是否实际相同

[]、[]、[]]
有三个不同的列表

[[]]*3
对同一列表有三个引用

因此,在
one
中,对于每个
j
,您将添加到不同的子列表中。但是在
two
中,您一直在添加到同一个子列表中


注意:使用
=
进行测试:
equals
是属于列表的一种方法,可以覆盖该方法以按照您想要的方式进行比较。它通常做“合理的事情”,在本例中,它涉及到查看列表的长度是否相同,如果相同,则查看每个元素是否相同——同时使用
=
。但另一方面,
,是一个更原始的东西:它从字面上看你是否真的在引用同一个内存对象


要创建多个新(不同)对象,可以执行以下操作

[ [] for i in range(9) ]

这两个选项的作用不同。您可以通过以下两个代码片段简化问题:

s = {"hello": "world"}
a = [s] * 2
print(a)
> [{'hello': 'world'}, {'hello': 'world'}]
显然,您创建了一个包含两个词典的列表。但是您创建了一个带有乘数的列表。这意味着,您可以创建一个列表,其中包含对单个词典的两个引用,而不是两个新的单独词典。对此词典的任何更改都将影响列表中的所有项目。让我们继续我们的例子:

s["hello"] = "python"
print(a)
> [{'hello': 'python'}, {'hello': 'python'}]

因此,我们更改了影响所有元素的初始字典。总结一下:在您的
fast
示例中,您创建了一个包含10个单独列表项的列表。在第二个示例中,您创建了一个列表,其中每个项目都引用了一个列表。像在for循环中那样更改此项将累积所有元素的大小。因此,在每次迭代中为每个元素创建新项。在您的示例中,您应该看到大量内存消耗,因为每次迭代都会为列表中的所有元素创建新元素。

这两个选项的作用不同。您可以通过以下两个代码片段简化问题:

s = {"hello": "world"}
a = [s] * 2
print(a)
> [{'hello': 'world'}, {'hello': 'world'}]
显然,您创建了一个包含两个词典的列表。但是您创建了一个带有乘数的列表。这意味着,您可以创建一个列表,其中包含对单个词典的两个引用,而不是两个新的单独词典。对此词典的任何更改都将影响列表中的所有项目。让我们继续我们的例子:

s["hello"] = "python"
print(a)
> [{'hello': 'python'}, {'hello': 'python'}]

因此,我们更改了影响所有元素的初始字典。总结一下:在您的
fast
示例中,您创建了一个包含10个单独列表项的列表。在第二个示例中,您创建了一个列表,其中每个项目都引用了一个列表。像在for循环中那样更改此项将累积所有元素的大小。因此,在每次迭代中为每个元素创建新项。在您的示例中,您应该会看到大量的内存消耗,因为每次迭代都会为列表中的所有元素创建新元素。

我建议Python在第一个数组上循环没有问题,因为它已按预期进行初始化,而另一个数组仅“理论上”存在于内存中。 相互比较初始化第二个数组,结果是两个数组相同。 循环也有同样的效果。在第一个数组上循环时,Python知道该做什么,但是在另一个数组上循环会使Python反复初始化数组,这可能需要一段时间,因为每次迭代都是一个新数组。 但这只是一个建议。
你的代码几乎让我的计算机冻结了:///p>我建议Python在第一个数组上循环没有问题,因为它已经按照它的预期进行了初始化,而另一个数组只“理论上”存在于内存中。 相互比较初始化第二个数组,结果是两个数组相同。 循环也有同样的效果。在第一个数组上循环时,Python知道该做什么,但是在另一个数组上循环会使Python反复初始化数组,这可能需要一段时间,因为每次迭代都是一个新数组。 但这只是一个建议。
你的代码几乎让我的电脑冻结了://

你比较过输出了吗?@BjørnKjos Hanssen So。。。。你不知道他们是否真的做了同样的事情,仍然在做比较。。。更重要的是,“慢”一点也不停止,而“快”则意味着它们不做相同的事情,这样的比较毫无意义。请定义慢或快。您比较过输出吗@