Python 函数返回乱序的列表对象

Python Function Returning List Objects Out of Order

我对 Python 语言比较陌生。我了解大部分基本功能和理论,对象的所有不同 类 及其 behavior/properties 等

反正我写基本函数是为了在实践中探索不同的概念,更直观地了解这门语言。有一个特别让我烦恼!任何人都可以分享为什么这个结果不符合预期吗?

这是我的代码 运行:

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,4,6] 所以 k.index(4) return 0 索引并将它乘以 2。所以最终结果是 [8,4, 12].

我想你是想这样做:

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]

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

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]

在第一次迭代中,第一个元素更改为 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)