Python函数返回列表对象乱序

时间:2017-12-06 21:10:19

标签: python python-3.x list function iterable-unpacking

我对Python语言比较陌生。我知道大部分的基本功能和理论,所有不同类别的对象及其行为/属性等。

无论如何,我正在编写基本功能来探索实践中的不同概念,并更直观地了解语言。特别让我感到烦恼!任何人都可以分享为什么这个结果不符合预期的洞察力吗?

以下是我运行的代码:

test_list = [2, 4, 6]
def test_func(k):
    global x, y, z
    for n in k:
        k[k.index(n)] = n * 2
    x, y, z = k
    return k
test_func(test_list)
print(test_list)
print(x)
print(y)
print(z)

我原以为结果是:

[4, 8, 12]
4
8
12

但实际结果如下:

[8, 4, 12]
8
4
12

似乎已经交换了列表的前两项。

我看不出是什么原因造成的?如果有人能看到这里发生的事情,请分享见解!

谢谢, 奥斯卡南部

4 个答案:

答案 0 :(得分:2)

在第一次迭代之后,你的列表看起来像[4,4,6],所以k.index(4)返回0索引并将它加倍2.所以最终结果是[8,4,12]。

答案 1 :(得分:1)

我认为你打算这样做:

test_list = [2, 4, 6]
def test_func(k):
    global x, y, z
    for i in range(len(k)):
        k[i] = k[i] * 2
    x, y, z = k
    return k

您正在将索引与值混合,并使用index()查找数组中的位置是不正确的,最重要的是因为您正在修改列表并且您将找到相同的元素,但在不同的位置,更好地使用range迭代索引并检索值。

另外,使用全局变量并不酷。事实上,整个过程应该像列表理解一样 - 简单而惯用:

[2 * x for x in test_list]
=> [4, 8, 12]

答案 2 :(得分:0)

您可以将代码压缩为列表理解和解压缩:

test_list = [2, 4, 6]
def test_func(k):
   global x, y, z
   x, y, z = [i*2 for i in k]
   return [x, y, z]

答案 3 :(得分:0)

在第一次迭代中,第一个元素更改为4.在第二次迭代中,索引4为0,而不是预期的1。 试试这个:

test_list = [2, 4, 6]
def test_func(k):
    global x, y, z
    l = list()
    for n in k:
        print(n, k.index(n))
        l.append(n * 2)
    x, y, z = l
    return l
test_func(test_list)
print(test_list)
print(x)
print(y)
print(z)