我对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
似乎已经交换了列表的前两项。
我看不出是什么原因造成的?如果有人能看到这里发生的事情,请分享见解!
谢谢, 奥斯卡南部
答案 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)