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)
我对 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)