通过max函数分配值时变量的值更改

时间:2019-11-26 09:10:59

标签: python reference

这是一个相对简单的问题,要从嵌套列表中列出具有最大值的元素。

所以我做了这个功能,

  1. 找到具有最大属性的元素
  2. 将最大属性替换为0
  3. 查找具有max属性的元素
  4. 返回元素。

这样做的时候,我陷入了第2步,从那以后就一直在那里。

这是功能:

def secondMax(data):
    x = max(data, key=lambda x:x[1])

    for i in range(0, len(data)):
        if(data[i][1] == x[1]):
            data[i][1] = 0
            print(x) #             prints ['yash',0]
    print(x) #                     prints ['yash',0]
    return data

当我运行代码时,这就是输出

正在运行

# data being fed
data = [['yash', 5.0], ['akash', 5.0], ['harsh', 3.0], ['dj', 4.0], ['ashutosh', 4.0]]
secondMax(data)

输出

# output 
['yash', 0]
['yash', 0]
[['yash', 0], ['akash', 5.0], ['harsh', 3.0], ['dj', 4.0], ['ashutosh', 4.0]]

现在,为什么不将第二个元素(akash,5.0)设置为(akash,0)?据我所知,x的值不应更改(正在更改)并引起这种情况。

为什么会这样?

2 个答案:

答案 0 :(得分:1)

看起来像

x = max(data, key=lambda x:x[1])

返回对最大元素的引用。因此,当您在第一次迭代中将其值设置为零时

        if(data[i][1] == x[1]):
            data[i][1] = 0

您实际上正在更改用于比较的值。从现在开始,x [1]将为零。因此基本上'akash'不匹配,因为您正在将其值5.0与0.0进行比较,后者显然会返回False

答案 1 :(得分:0)

以下代码中的max_user引用了同一对象,即nested list中的data。当我们更改嵌套列表的内部值时,它也将反映在我们的max_user中(因为它引用的是同一对象,而不是内部值)。

因此,我选取了{_1}个max_user并将其用于比较。

进行了一些小的更正,您可以遍历列表并循环访问它,而无需使用.copy()

range

输出:

>>> def secondMax(data):
    max_user = max(data, key=lambda x:x[1])
    _temp = max_user.copy()

    for user in data:

        if user[1] == _temp[1]:
            user[1] = 0
            print(_temp)
    print(_temp)
    return data