【问题标题】:Are lists immutable in python? And are they passed value in a function?python中的列表是不可变的吗?它们是否在函数中传递值?
【发布时间】:2015-12-10 05:41:22
【问题描述】:
def threshold(the_list,thresholding_value,upper_val,lower_value):
    ret_list=list(the_list)
    for each_item in ret_list:
        if each_item <= thresholding_value:
            each_item=lower_value
        else:
            each_item=upper_val
    return ret_list

temp=[-1,2,5,3,-1,5,32,-6]
ttt=r.threshold(temp,0,1,0)

执行后我仍然得到列表相同的值

【问题讨论】:

    标签: python list parameter-passing immutability


    【解决方案1】:

    列表不是不可变的,但是当你循环遍历一个时,循环控制变量会获取每个项目的副本;它不是它的别名。所以更改它不会影响列表。

    一个更 Pythonic 的方法是列表推导返回新列表:

    def threshold(the_list, threshold, upper, lower):
      return [lower if item <= threshold else upper for item in the_list]
    
    threshold([-1,2,5,3,-1,5,32,-6],0,1,0)
    # => [0, 1, 1, 1, 0, 1, 1, 0]
    

    【讨论】:

    • 如果列表是一个类的属性,并且我在循环它的过程中改变了这个属性——改变确实会影响列表
    • @neumlouno - 列表是否为属性并不重要,当然,如果您更改列表变量或属性或任何它会改变的东西。这里的重点是,如果您执行for var in (any list expression here):,那么在该循环的主体中修改var 根本不会影响被循环的列表。
    【解决方案2】:

    each_item 只是一个局部变量,其值被 = 运算符覆盖。为其赋值不会影响原始列表。相反,您可以创建一个新列表并在返回之前将其填满:

    def threshold(the_list, thresholding_value, upper_val, lower_val):
        ret_list = list()
        for each_item in the_list:
            if each_item <= thresholding_value:
                ret_list.append(lower_val)
            else:
                ret_list.append(upper_val)
        return ret_list
    

    您还可以通过使用列表推导来显着缩短此代码:

    def threshold(the_list, thresholding_value, upper_val, lower_val):
        return [lower_val if x <= thresholding_value else upper_val for x in the_list]
    

    【讨论】:

    • 好的,非常感谢您的回答。我认为这个迭代变量的工作原理与我们通常用于 Java 或 C 的一样。实际上我是 python 的新手,你能解释一下 return 语句的含义吗?
    • 在第二个例子中?这是list comprehension。这是一种定义新列表的简单方法,无需经历编写大循环的稳健性。
    【解决方案3】:

    列表绝对是可变的。发生的情况是您遍历列表,每个元素依次复制到each_item。 each_item 发生的事情与列表无关,因为它只是一个保存值的临时变量,而不是指针。

    将 each_item 表示为 1 元素列表或类可以解决您的问题,但整个方法并不是通常在 python 中完成的方式:当您可以创建一个空列表作为返回值和随手添加元素?

    【讨论】:

      猜你喜欢
      • 2022-07-10
      • 2021-07-20
      • 2011-09-19
      • 2011-01-29
      • 1970-01-01
      • 2014-08-09
      • 2011-01-20
      • 2015-04-04
      • 2019-12-20
      相关资源
      最近更新 更多