IntelliJ Idea中Redeclared警告原因及Python代码差异解析
问题:两种处理列表元素的代码为何效果不同?
我有一个包含如下姓名的文本文件:
Aang Zuko Appa Katara Sokka Momo Uncle Iroh Toph
我将文件内容按行读取为包含换行符(如'Aang\n')的列表。为去除换行符,我尝试使用strip()方法,代码如下,但不仅未生效,还在IntelliJ Idea中出现警告:"Redeclared <each_name> defined above without usage."
with open(file="./Input/Names/invited_names.txt", mode="r") as names_file: names = names_file.readlines() for each_name in names: each_name = each_name.strip() print(names)
而以下代码无此警告且能正常生效:
with open(file="./Input/Names/invited_names.txt", mode="r") as names_file: names = names_file.readlines() for i in range(len(names)): names[i] = names[i].strip()
请问为何会出现这种差异?
原因分析
1. 第一种循环:临时变量未修改原列表
在for each_name in names的循环中,each_name是临时变量,每次循环仅指向列表中的当前元素。但Python的字符串是不可变对象,strip()方法不会修改原字符串,而是返回一个去除换行符的新字符串。
执行each_name = each_name.strip()时,只是让each_name这个临时变量指向了新的字符串对象,原列表names中的旧元素(带换行符的字符串)完全没被替换。循环结束后原列表毫无变化,且你修改了each_name却未使用这个新值,因此IDE会抛出“重复声明且未使用”的警告。
2. 第二种循环:直接修改列表元素
for i in range(len(names))通过索引遍历列表,names[i]直接指向列表对应位置的元素。执行names[i] = names[i].strip()时,是把strip()返回的新字符串赋值给列表的第i个位置,直接替换了原列表中的旧元素,所以原列表会被更新,最终实现去除换行符的效果。同时这段代码没有产生未使用的临时变量,自然不会触发IDE警告。
内容的提问来源于stack exchange,提问作者Sriyan Ravuri
相关产品推荐
相关产品推荐

