是什么决定了变量是否会被更改


class MyClass:
def __init__(self, a):
self.a = a
def append(some_list):
some_list.append(["d"])

foo =[["a"],["b"],["c"]]
bar = foo
my_class = MyClass(foo)
append(bar)
for item in bar:
item[0] += "x"
letters = item[0]
letters += "z"
print (my_class.a)

产生输出

[['ax'], ['bx'], ['cx'], ['dx']]

这个例子中发生了很多事情,我对所有这些都感觉很好,除了我希望"z"也被标记到字符串上,但事实并非如此。

有人能解释为什么字符串中不包含"z"是有意义的吗?

我认为索引会返回带有字符串的"容器",然后附加"z"会改变存储的字符串。显然,一个独特的"容器"是如何制造的,但我不明白为什么。

(如果附加到字符串后生成一个新的字符串,我不知道为什么我测试的整数也会发生同样的行为…使用浮点会有不同的结果吗?(

这是因为可变对象。例如

>>>l1 = [1,2,3]
>>>l2 = l1
>>>l2[0]=4
>>>print(l1[0])
4

在该示例中,l1l2指向相同的存储器位置。要将l1创建为l2的副本,请使用copy():

>>>l1 = [1,2,3]
>>>l2 = l1.copy()
>>>l2[0]=4
>>>print(l1[0]) 
1
>>>print(l2[0])
4

编辑:根据建议更改解释。

在您的示例中,foobar指向相同的内存位置:您在foo中更改的内容也在bar中更改。为什么它不附加";z";是因为letters是一个声明的变量,其值为item[0],但它没有发生变化。如果是print(letters),它将打印"dz"