什么决定变量是否会被改变?

What determines if the variable will be altered or not?

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”是有意义的吗?

我认为索引会 return 带有字符串的“容器”,然后附加“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".