附加列表时出现意外的循环行为

-1 python loops

我想知道为什么下面的代码按预期工作。目的是制作一个列表列表,其中每个内部列表都包含特定作者的书籍。一位朋友在临时列表声明后不小心将其追加到临时列表中,并且代码仍然有效。我在内部 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

当您分配tmpall_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)