Python 3.x 是';对于';或';。附加()';python中的bug?
我尝试使用Python 3.x 是';对于';或';。附加()';python中的bug?,python-3.x,Python 3.x,我尝试使用'uga'作为输入(=文本)。我想把[['U','g','a'],['U','g','a'],['U','g','a']作为输出 我尝试过以下代码: text = 'uga' abc = list(text) out_list = [] for i in range (len(text)): out_list.append(abc) x = out_list.copy() for item in range(len(x)): x[item][item] = x[i
'uga'
作为输入(=文本)。我想把[['U','g','a'],['U','g','a'],['U','g','a']作为输出
我尝试过以下代码:
text = 'uga'
abc = list(text)
out_list = []
for i in range (len(text)):
out_list.append(abc)
x = out_list.copy()
for item in range(len(x)):
x[item][item] = x[item][item].upper()
print(x)
使用该代码后,我得到了[['U','G','A'],['U','G','A'],['U','G','A']]
作为输出
如果我们切断密码
text = 'uga'
abc = list(text)
out_list = []
for i in range (len(text)):
out_list.append(abc)
x = out_list.copy()
print(x)
它将给出[['u',g',a'],['u',g',a'],['u',g',a']]
作为输出
之后,我尝试在不使用append()
的情况下生成代码。我只是使用以下列表生成一个新变量-->[['u',g',a'],['u',g',a'],['u',g',a']
,它与x
a = [['u', 'g', 'a'], ['u', 'g', 'a'], ['u', 'g', 'a']]
for item in range(len(a)):
a[item][item] = a[item][item].upper()
print(a)
令人惊讶的是,我得到的结果是[['U',g',a'],['U',g',a'],['U',g',a'],['U',g',a']
之后,我再次尝试手动使用append,如下所示:
b = []
b.append(['u','g','a'])
b.append(['u','g','a'])
b.append(['u','g','a'])
for i in range (len(b)):
b[i][i] = b[i][i].upper()
print(b)
[['U', 'g', 'a'], ['U', 'g', 'a'], ['U', 'g', 'a']]
[['U', 'G', 'a'], ['U', 'G', 'a'], ['U', 'G', 'a']]
[['U', 'G', 'A'], ['U', 'G', 'A'], ['U', 'G', 'A']]
[['U', 'G', 'A'], ['U', 'G', 'A'], ['U', 'G', 'A']]
结果也是正确的,即[['U','g','a'],['U','g','a'],['U','g','a']]
我不知道为什么我的第一个代码给出了错误的结果…因为当我检查x
的类型时,a
和b
是相同的列表。
然后我检查a==b==x
它给出结果True
我还将它们放在相同的代码中,即:
for i in range (len(something)):
something[i][i] = something[i][i].upper()
我想了很多,问了很多朋友,但是没有人知道发生了什么
我很抱歉,因为我的英语不是很好。希望你能帮助我
谢谢如果在第二个循环中添加打印语句,您可以看到会发生什么。输出如下所示:
b = []
b.append(['u','g','a'])
b.append(['u','g','a'])
b.append(['u','g','a'])
for i in range (len(b)):
b[i][i] = b[i][i].upper()
print(b)
[['U', 'g', 'a'], ['U', 'g', 'a'], ['U', 'g', 'a']]
[['U', 'G', 'a'], ['U', 'G', 'a'], ['U', 'G', 'a']]
[['U', 'G', 'A'], ['U', 'G', 'A'], ['U', 'G', 'A']]
[['U', 'G', 'A'], ['U', 'G', 'A'], ['U', 'G', 'A']]
正如您所看到的,所有的值都会同时更改。这是因为您将abc对象添加到数组中3次,而没有复制它。在第一个代码段中,out\u list[0]是out\u list[1]
。在第二个代码段中,out\u list[0]==out\u list[1]
。请参阅。您需要复制abc
,这样您就有了不同的子列表,而不是复制出列表(或使用deepcopy)。通过单步执行检查您的代码在可视化工具中的运行情况,它应该非常清晰。(不要编写答案,因为它几乎肯定会作为副本关闭。)