gpt4 book ai didi

python - 列表通过引用在 Python 中传递混淆

转载 作者:太空宇宙 更新时间:2023-11-04 00:35:49 27 4
gpt4 key购买 nike

我有这段代码,它只对保证介于 0 和 R-1(含)之间的数字列表进行排序。以下代码正确排序,但我不明白为什么传入的输入保持不变。

def bucket(arr, R):
assert type(arr) is list
for i in arr:
assert i >=0 and i < R
b = [0] * R
for i in arr:
b[i]+=1
arr = []
for ind, v in enumerate(b):
arr = arr + [ind] * v
print(arr)

为什么这个例子中的inp在函数调用后没有变化:

>>> inp
[3, 1, 4, 5, 4, 5, 5, 5, 1, 5]
>>> bucket(inp, 8)
[1, 1, 3, 4, 4, 5, 5, 5, 5, 5]
>>> inp # unchanged, why?
[3, 1, 4, 5, 4, 5, 5, 5, 1, 5]

最佳答案

因为您在 arr = [] 行中创建了一个名为 arr 的新变量,并且从这一点开始您对一个新列表进行操作。同样,您总是在以下 for 循环中使用 arr = arr + [ind] * v 操作创建新列表。

您可以简单地将其更改为:

def bucket(arr, R):
assert type(arr) is list
for i in arr:
assert i >= 0 and i < R
b = [0] * R
for i in arr:
b[i] += 1
arr[:] = [] # remove all items from the list (in-place)
for ind, v in enumerate(b):
arr.extend([ind] * v) # extend the list in-place, you could also use "arr += [ind] * v"
print(arr)

例子:

>>> inp = [3, 1, 4, 5, 4, 5, 5, 5, 1, 5]
>>> bucket(inp, 8)
[1, 1, 3, 4, 4, 5, 5, 5, 5, 5]
>>> inp
[1, 1, 3, 4, 4, 5, 5, 5, 5, 5]

关于python - 列表通过引用在 Python 中传递混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44080713/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com