我想知道为什么下面的代码按预期工作。目的是制作一个列表列表,其中每个内部列表都包含特定作者的书籍。一位朋友在临时列表声明后不小心将其追加到临时列表中,并且代码仍然有效。我在内部 for 循环之后追加,它的工作方式与正常情况一样。
代码:
all_books = []
for author in os.listdir("books/"):
tmp = []
all_books.append(tmp)
for book in os.listdir("books/" + author + "/"):
tmp.append(book)
print(all_books)
Run Code Online (Sandbox Code Playgroud)
输出:
[['On_the_Origin_of_Species.txt', 'The_Power_of_Movement_in_Plants.txt'],
['Adventures_of_Sherlock_Holmes.txt',
'Memoirs_of_She rlock_Holmes.txt',
'The_Lost_World.txt'],
['A_Treatise_of_Human_Nature.txt', 'An_Enquiry_Concerning_Human_Understanding.txt'],
['Treasure_Island.txt'],
['Ivanhoe A_Romance.txt', 'The_Lady_of_the_Lake.txt']]
Run Code Online (Sandbox Code Playgroud)
小智 5
当您分配tmp到all_data. 它不是创建 的新副本tmp,而是创建变量的引用tmp。这就是导致这个问题的原因。
相同的对象在Python中是相同的id。如果id相同,则名称引用相同的变量。
all_data = []
tmp = []
all_data.append(tmp)
print("all_data_tmp id",id(all_data[0]))
print("tmp id",id(tmp))
tmp.append(2)
print("all_data",all_data)
Run Code Online (Sandbox Code Playgroud)
输出:
all_data_tmp id 2322674224840
tmp id 2322674224840
all_data [[2]]
Run Code Online (Sandbox Code Playgroud)