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)。通过单步执行检查您的代码在可视化工具中的运行情况,它应该非常清晰。(不要编写答案,因为它几乎肯定会作为副本关闭。)