首页 > 解决方案 > 关于为什么没有更新结果的问题?

问题描述

我正在查看我的评论论文,但不理解以下编码。

def function_b(b_list, high_num):
    c_list = [0, 0, 0, 0, 0, 0,0]
    i = 0
    for num in b_list:
        if num > high_num:
            c_list[i] = num
        i = i + 1
    b_list = c_list

def main():
    b_list = [1,3, 6, 4, 1, 2, 8]
    high_num = 4
    function_b(b_list, high_num)
    print(b_list)

main()

结果是 [1, 3, 6, 4, 1, 2, 8] 为什么 b_list 没有用 c_list 更新?

标签: python

解决方案


正如这个答案所解释的:

如果你将一个可变对象传递给一个方法,该方法会得到一个对同一个对象的引用,你可以随心所欲地改变它,但是如果你在方法中重新绑定引用,外部作用域将一无所知,之后大功告成,外部引用仍将指向原始对象。

换句话说,该行b_list = c_list仅更改b_list函数中指向的内容。它不会改变b_list指向 in 的内容main。所以解决方法是修改 的元素b_list,而不是指向b_list一个全新的列表。

另一个提示来自这个问题。如果您需要数组的索引以及该索引处的值,则可以使用该enumerate函数。

把它们放在一起,函数可以写成这样:

def function_b(b_list, high_num):
    for i, num in enumerate(b_list):  # use 'enumerate' to get both index and value
        if num <= high_num:           # check for small numbers in the list
            b_list[i] = 0             # change the small numbers to 0

推荐阅读