Python中for循环修改列表元素的差异问题咨询
Python中for循环修改列表的差异解析
案例1:嵌套列表被修改
user_data_list = [['Full Name', ' Email Address'],['Blossom Gill', ' blossom@abc.edu'], ['Hayes Delgado', ' nonummy@utnisia.com'], ['Petra Jones', ' ac@abc.edu'], ['Oleg Noel', ' noel@liberomauris.ca']] old_domain_email_list = ['blossom@abc.edu','ac@abc.edu'] new_domain_email_list = ['blossom@xyz.edu','ac@xyz.edu'] for user in user_data_list[1:]: for old_domain, new_domain in zip(old_domain_email_list, new_domain_email_list): if user[1] == ' ' + old_domain: user[1] = ' ' + new_domain print(user_data_list)
运行结果:
[['Full Name', ' Email Address'], ['Blossom Gill', ' blossom@xyz.edu'], ['Hayes Delgado', ' nonummy@utnisia.com'], ['Petra Jones', ' ac@xyz.edu'], ['Oleg Noel', ' noel@liberomauris.ca']]
案例2:一维列表未被修改
my_list = ['a','b','c','d'] old_my_list = ['b','d'] new_my_list = ['repalce_1','repalce_2'] for i in my_list: for old_, new_ in zip(old_my_list,new_my_list): if i == old_: i= new_ print(my_list)
运行结果:
['a', 'b', 'c', 'd']
差异原因解析
这两个案例的本质区别在于Python中可变对象与不可变对象的特性,以及变量引用的操作逻辑:
案例1的逻辑
user是user_data_list中嵌套子列表的直接引用,而列表属于可变对象。当执行user[1] = ' ' + new_domain时,并没有给user变量重新赋值,而是直接修改了user指向的那个子列表的内部元素。由于user和原列表中的子列表是同一个对象,所以原列表会同步反映出这个修改。案例2的逻辑
i是从my_list中取出的字符串元素,字符串属于不可变对象。当执行i = new_时,只是将i这个变量重新指向了一个新的字符串对象,并没有修改原列表中原来的字符串元素。原列表里的元素还是最初的那些字符串对象,因此打印原列表时不会看到变化。
简单总结:
- 可变对象(如列表)可以直接修改内部内容,修改会影响所有指向它的引用;
- 不可变对象(如字符串、数字)无法修改自身,只能让变量指向新对象,不会改变原列表中的旧元素。
内容的提问来源于stack exchange,提问作者Mr-thanh
相关产品推荐
相关产品推荐

