List中为啥修改一个值其他值也变

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了List中为啥修改一个值其他值也变相关的知识,希望对你有一定的参考价值。

比如有一个List<xxxxBean> lists , 里面有4条数据
然后 list.get(1).setName("啊啊啊"); 之后 其他三条数据里面的name成员变量的值也都变成了"啊啊啊" 什么原因会导致这样的问题

import copy
List2=copy.deepcopy(List1)


这样赋值,List2初始值和List1一样,因为是深度复制List1中的元素,所有深层元素都引用的是不同的对象,List1的任何改变不会影响List2

参考技术A Listlist=commonService.findByHql(hql);现在这个List里面放的是一个表(TGzmsExaminee),我要修改这个表下面的一个字段,请问这么实现?

即使未显式修改数组值也已修改[重复]

【中文标题】即使未显式修改数组值也已修改[重复]【英文标题】:Array value modified even though it was not modified explicitly [duplicate] 【发布时间】:2018-01-15 05:44:16 【问题描述】:

我编写了下面的代码,试图将一个元素添加到新数组的开头并返回该新数组。它工作正常,但是当我返回 arr 而不是 newArr 时,arr 也发生了变化。

function addToFrontOfNew(arr, element) 
  newArr = arr;
  newArr.unshift(element);
  return newArr;

如果我要写:

 function addToFrontOfNew(arr, element) 
  newArr = arr;
  newArr.unshift(element);
  return arr;

并使用 addToFrontOfNew([1,2], 3) 测试函数,该函数将返回 [3, 1, 2]。

如何重写函数,使原来的 arr 不会随着 newArr 一起被修改?

【问题讨论】:

return [element].concat(arr) 这是因为在您的代码中 newArrarr 都引用同一个数组。您没有克隆阵列。检查***.com/questions/3978492/… 【参考方案1】:

您应该克隆原始数组而不是引用它。一种方法是:

function addToFrontOfNew(arr, element) 
  newArr = arr.slice();
  newArr.unshift(element);
  return newArr;

slice() 方法返回一个浅拷贝...这里是详细信息https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice

【讨论】:

【参考方案2】:
function addToFrontOfNew(arr,element,rv)

    var len = arr.length;
    for(i=0; i<len; i++)
    
        if (i==0) 
            newArr = [element,arr[0]];
         else 
            newArr.push(arr[i]);
        
    

    switch(rv)
    
        case 'arr':
            return arr;
        break;

        case 'newArr':
            return newArr;
        break;
    


var fruit = ['cherries','apples','pears'];
var newElement = 'bananas';

console.log(addToFrontOfNew(fruit,newElement,'arr'));
console.log(addToFrontOfNew(fruit,newElement,'newArr'));

** 修复了处理评论的代码 **

添加了一个 switch 语句,以便最终用户可以返回原始数组或新数组。基本上它计算原始数组,如果增量 = 0,则创建新数组,添加第一个元素,然后循环遍历数组的其余部分,将剩余元素按顺序推送到数组中。 switch 语句允许您返回原始数组或新数组。在控制台日志中工作,如果您使用 jQuery 将其输出到标签,只需将 .toString() 附加到函数的末尾即可。

【讨论】:

此代码不起作用。尝试使用console.log 而不是alert,你会发现结果是错误的。 [arr.toString()] 并没有像你想象的那样做任何事情。 制作数组(浅)副本的正确方法是array.slice() 乔丹跑步 - 立即尝试。

以上是关于List中为啥修改一个值其他值也变的主要内容,如果未能解决你的问题,请参考以下文章

如何将list中一个对象添加到该list中其他对象中

为啥在修改引用的程序集时会重建其他程序集?

python 为啥我修改列表一个元素会导致所有元素都被修改

为啥函数可以修改调用者感知的某些参数,而不能修改其他参数?

更改一个文本字段的值也会无意中更改几个其他文本字段。我该如何防止这种情况?

装饰器